Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]3371[/thread]

Kann mans nicht schöner und schneller schreiben



<< |< 1 2 >| >> 19 Einträge, 2 Seiten
Magic
 2003-11-05 17:02
#35658 #35658
User since
2003-09-30
91 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,
hat jemand ne Ahnung, ob ich den folgenden SQL-Ausdruck schöner, schneller oder besser formulieren kann?

Code: (dl )
SELECT levelname FROM level WHERE level_min <= 25 ORDER by blevel_min DESC LIMIT 1


level ist eine tabelle mit werten und entsprechenden namen. z.b. 10 = klein, 20 = mittelklein, 30 = gehtso, 40 = naja....

wenn nun ein wert zwischen 20 und 29 übergegeben wird soll mittelklein, zwischen 30 und 39 gehtso usw. zurückgegeben werden. Halt immer der maximal mögliche Wert.

Gibt&acute;s da ne schnellere oder schönerer Möglichkeit als das oben?

Gruss
Stefan

PS: Hoffentlich versteht man das wirre Zeugs das ich da geschrieben hab *g
Ein Weiser gibt nicht die richtigen Antworten, sondern er stellt die richtigen Fragen.
Crian
 2003-11-05 17:57
#35659 #35659
User since
2003-08-04
5867 Artikel
ModeratorIn
[Homepage]
user image
Was macht denn das "LIMIT 1"?

Und was stört Dich an dem Code?
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
renee
 2003-11-05 20:59
#35660 #35660
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
"LIMIT1" bedeutet, dass Dir nur 1 Datensatz angezeigt wird...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
jan10001
 2003-11-05 22:10
#35661 #35661
User since
2003-08-14
962 Artikel
BenutzerIn
[default_avatar]
Quote
level ist eine tabelle mit werten und entsprechenden namen. z.b. 10 = klein, 20 = mittelklein, 30 = gehtso, 40 = naja....

wenn nun ein wert zwischen 20 und 29 übergegeben wird soll mittelklein, zwischen 30 und 39 gehtso usw. zurückgegeben werden. Halt immer der maximal mögliche Wert.

Gibt&acute;s da ne schnellere oder schönerer Möglichkeit als das oben?
Wozu brauchst du da ne Datenbank? Ich würde die Werte im Script verarbeiten.
format_c
 2003-11-05 22:17
#35662 #35662
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Weis nicht ob ich dich richtig verstanden hab aber so gehts auch anders:
Code: (dl )
1
2
3
4
5
6
7
mysql> SELECT levelname FROM level WHERE 24 BETWEEN levelmin AND levelmin + '10';
+-----------+
| levelname |
+-----------+
| mittel |
+-----------+
1 row in set (0.00 sec)


Gruß Alex
format_c
 2003-11-05 22:19
#35663 #35663
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
[quote=jan10001,05.11.2003, 21:10]...
Wozu brauchst du da ne Datenbank? Ich würde die Werte im Script verarbeiten.[/quote]
Stimmt eigentlich auch. Mit ner Datenbank ist das schon ganz schön overkill.

Gruß Alex
Magic
 2003-11-06 00:09
#35664 #35664
User since
2003-09-30
91 Artikel
BenutzerIn
[Homepage] [default_avatar]
So,
ich versuch mal alle Fragen zu klären:
Als erstes mal das LIMIT 1.
Das LIMIT 1 sorgt in diesem Fall dafür, dass der erste Datensatz der auf das matching pass rausgezogen wird und danach Schluss ist, da man/ich eh nicht mehr brauch.
Warum ich&acute;s anders haben will? Ganz einfach. Das ist irgendwie nur ein Workaround. Ich dachte, das es da so etwas wie SELECT MAX( id) oder so gibt was einfach etwas optimierter ist.
Das ganze ist wegen der userfreundlichkeit in einer DB und nicht im Script. Die Werte in der DB sollen relativ einfach über ein Inteface anpassbar sein. Das ist, wenns im Script steht, so gut wie unmöglich, oder zumindest verdammt aufwendig.

Der Ansatz von format_c sieht doch gut aus, irgendwie so war das, was ich da mal gesehen habe. Werds morgen mal ausprobieren.

Schon mal riesen Dank und Gruss an alle,
Stefan
Ein Weiser gibt nicht die richtigen Antworten, sondern er stellt die richtigen Fragen.
Strat
 2003-11-06 02:42
#35665 #35665
User since
2003-08-04
5246 Artikel
ModeratorIn
[Homepage] [default_avatar]
funktioniert vielleicht
[sql]SELECT max(levelname) AS maximum FROM level WHERE 24 BETWEEN levelmIN AND levelmin + '10';
[/sql]

Edit Renee: Code-Tags korrigiert\n\n

<!--EDIT|renee|1068101891-->
perl -le "s::*erlco'unaty.'.dk':e,y;*kn:ai;penmic;;print"
http://www.fabiani.net/
format_c
 2003-11-06 10:28
#35666 #35666
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
@Strat: ???
Wenn die Tabelle so aussieht wie oben beschrieben sollte es eigentlich nie zu einer Abfrage mit mehr als 1 Ergebnis kommen.

Aber was bei einem String MAX bringen soll kann ich nicht so recht nachvollziehen. Kannst du mich bitte in deinen Gedanken etwas aufklären.


Gruß Alex
Crian
 2003-11-06 10:51
#35667 #35667
User since
2003-08-04
5867 Artikel
ModeratorIn
[Homepage]
user image
[quote=Magic,05.11.2003, 16:02]
Code: (dl )
SELECT levelname FROM level WHERE level_min <= 25 ORDER by blevel_min DESC LIMIT 1


[...]

Halt immer der maximal mögliche Wert.
[/quote]

[quote=Magic,05.11.2003, 23:09]So,
ich versuch mal alle Fragen zu klären:
Als erstes mal das LIMIT 1.
Das LIMIT 1 sorgt in diesem Fall dafür, dass der erste Datensatz der auf das matching pass rausgezogen wird und danach Schluss ist, da man/ich eh nicht mehr brauch.
[/quote]

Aha, jetzt verstehe ich, was Du möchtest. Ich dachte gerade, DU könntest dann alternativ mit MAX() arbeiten, aber Du willst Dir ja nicht "level_min" ausgeben lassen, nach dem Du sortierst, sondern den dazugehörigen "levelname"n.

Hmmm....

Auf jeden Fall kannte ich bisher LIMIT nicht. Ist das Standard-SQL? In meinem SQL-Buch finde ich dazu nichts.
s--Pevna-;s.([a-z]).chr((ord($1)-84)%26+97).gee; s^([A-Z])^chr((ord($1)-52)%26+65)^gee;print;

use strict; use warnings; Link zu meiner Perlseite
<< |< 1 2 >| >> 19 Einträge, 2 Seiten



View all threads created 2003-11-05 17:02.