MySQL WHERE oder ORDER BY Klausel mit Berechnung möglich???
Ahnungsloser
- php
0 fastix®
hab da mal e bissel gegoogelt, aber bis jetzt nichts vernünftiges zu dem thema gefunden, also frag ich mal hier nach
kann ich in einem mysql_query folgendes übergeben?
"SELECT user, bar, konto FROM MoneyTable LIMIT 10 ORDER BY bar+konto DESC"
kann ich solch eine Berechnung an MySQL übergeben und es werden die 10 Datensätze mit den höchsten Werten aus bar+konto zurückgeliefert
oder muss ich alle Datensätze auslesen das Ergebnis berechnen und alles per
hand über user sortieren?
Dann wäre es am End nämlich einfacher bzw günstiger ein weiteres Feld (money)
in die Datenbank einzutragen dass den kombinierten wert von bar+konto enthält und das ganze dann als
"SELECT user, money FROM MoneyTable LIMIT 10 ORDER BY money DESC"
abzufragen! Wie gesagt wenn es möglich wäre könnte ich mir ein Feld in der DB
sparen!
Moin!
"SELECT user, bar, konto FROM MoneyTable LIMIT 10 ORDER BY bar+konto DESC"
Was hast Du falsch gemacht:
Order und Limit haben falsche Reihenfolge, Klammern fehlen ... und ja. Mysql kann rechnen.
Richtig ist also:
SELECT `user`, `bar`, `konto`, (`konto` + `bar`) AS `barvermoegen` FROM `moneytable` ORDER BY `barvermoegen` DESC LIMIT 10;
oder halt ein schnödes:
SELECT
user,
bar,
kontoFROM
moneytable ORDER BY (
bar+
konto) DESC LIMIT 10;
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
super danke des is opti
das ich LIMIT und ORDER BY vertauscht hatte hab ich eben schon beim Testen gemerkt und geändert,
Das ist echt klasse da erspar ich mir jede Menge Arbeit!
Jetzt noch rein interessehalber was an berechnungen kann den dürchgeführt werden??? Ich nehm mal an standard + - * / geht auf jeden
wie sieht das mit funktionen wie sqrt log und power aus
bzw. mit bitwise operatoren wie << >> && || ???
Danke schonmal
ja super ok ... ich glaub ich muss mir das mal alles als Buchform zum
nachschlagen zulegen!!!
nochmal zu der if abfrage, kann ich das auch in die ORDER BY klausel
auslagern??
Moin!
nochmal zu der if abfrage, kann ich das auch in die ORDER BY klausel
auslagern??
Nein.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Hi!
nochmal zu der if abfrage, kann ich das auch in die ORDER BY klausel
auslagern??Nein.
Wieso nicht? Wenn man da Funktionen wie RAND() verwenden kann, warum sollte da ein IF() nicht gehen? Zumal ein gültiger Wert für das ORDER-BY-Argument ein Spaltenname, ein Ausdruck(!) oder eine Positionsnummer ist.
Übrigens, auch sind die Klammern optional und nicht fehlend.
Lo!
Moin!
nochmal zu der if abfrage, kann ich das auch in die ORDER BY klausel
auslagern??
Nein.
Wieso nicht? ... Zumal ein gültiger Wert für das ORDER-BY-Argument ein Spaltenname, ein Ausdruck(!) oder eine Positionsnummer ist.
Stimmt. Hast recht. Hab es gerade getestet:
SELECT
sp_1,
s2_p,
sp_3FROM
tab_1ORDER BY (IF ('' !=
sp_1,
sp_1,
sp_2)) DESC LIMIT 3;
Auf die Quotas und Backticks achten.
Übrigens, auch sind die Klammern optional und nicht fehlend.
Und wer soll dann noch durchsehen?
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Moin Männers,
Danke schonmal für die vielen Tips, aber ich muss euch leider sagen das ich die if Anweisung in allen möglichen Variation unter berücksichtigung eurer Ratschläge in meine Abfrage mit eingebaut habe aber immer einen Datenbankfehler erzeugt hab
Jetzt hab ich mir mal die sql Docu von if reingezogen und es wird dort eigentlich nur so beschrieben das es nach dem SELECT eingesetzt wird, die anderen Möglichkeiten werden nicht angesprochen und sind deshalb vielleicht auch garnicht möglich???
siehe SELECT IF(expr1, expr2, expr3) FORM Table ...
Hi!
Danke schonmal für die vielen Tips, aber ich muss euch leider sagen das ich die if Anweisung in allen möglichen Variation unter berücksichtigung eurer Ratschläge in meine Abfrage mit eingebaut habe aber immer einen Datenbankfehler erzeugt hab
Konkrete Problemlösungsvorschläge gibts im Austausch zu konkreten Problembeschreibungen.
Jetzt hab ich mir mal die sql Docu von if reingezogen und es wird dort eigentlich nur so beschrieben das es nach dem SELECT eingesetzt wird, die anderen Möglichkeiten werden nicht angesprochen und sind deshalb vielleicht auch garnicht möglich???
IF() ist eine Funktion wie andere auch. Funktionen können in Audrücken (Expressions) verwendet werden. ORDER BY lässt (wenn die Umsetzung nicht gerade fehlerhaft ist) auch Expressions zu. Also ist die Verwendung von IF() in der ORDER-BY-Klausel erst einmal prinzipiell gestattet.
Lo!
Ok pass auf ich hab das ganze in dieser Form probiert
"SELECT
user,
money,
bank
FROM ".TBL_STATS."
ORDER BY (IF(money + bank >= 1, money + bank, money)) DESC
LIMIT 10"
ich habe es aber auch in dieser Form probiert
"SELECT
user,
money,
bank ,
(IF(money + bank >= 1, money + bank, money)) AS cash
FROM ".TBL_STATS."
ORDER BY cash DESC
LIMIT 10"
aber irgendwie will es nicht hinhauen die query liefert mir immer false zurück
Moin!
aber irgendwie will es nicht hinhauen die query liefert mir immer false zurück
* Was steht in TBL_STATS?
* Lass Dir den sql-String ausgeben. (echo "<pre>$sql</pre>";
* lass Dir die Fehlermeldung von mysql ausgeben.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Moin!
* Lass Dir den sql-String ausgeben. (echo "<pre>$sql</pre>";
echo '<pre>' . htmlentities($sql) . '</pre>';
natürlich.
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix
Tach auch.
nochmal zu der if abfrage, kann ich das auch in die ORDER BY klausel
auslagern??Nein.
Wieso nicht? Wenn man da Funktionen wie RAND() verwenden kann, warum sollte da ein IF() nicht gehen? Zumal ein gültiger Wert für das ORDER-BY-Argument ein Spaltenname, ein Ausdruck(!) oder eine Positionsnummer ist.
Da muss man aber ein wenig auf die MySQL Version achten.
Ich durfte Montag etwas auf einer MySQL 5.0.26 (die ursprüngliche Version auf einem SLES10) ausrollen, und da hatte ich Probleme mit
SELECT
irgendeinausdruck AS created -- Datentyp DATETIME
FROM blah
ORDER BY IFNULL(created, '2100-01-01 00:00:00') -- Q&D: die ohne created Zeitstempel nach hinten sortieren
Hatte nun leider nicht die Gelegenheit, lange den Fehler zu suchen (der eigentliche Fehler bestand eh darin auf einer anderen MySQL Version zu testen als auszurollen, auch wenn zwischen 5.0.26 und 5.0.51 nur die Minor-Nummer geändert wurde), sondern hab das Statement einfach umgeschrieben.
Bis die Tage,
Matti
Hi!
Wenn man da Funktionen wie RAND() verwenden kann, warum sollte da ein IF() nicht gehen? Zumal ein gültiger Wert für das ORDER-BY-Argument ein Spaltenname, ein Ausdruck(!) oder eine Positionsnummer ist.
Da muss man aber ein wenig auf die MySQL Version achten.
Ich durfte Montag etwas auf einer MySQL 5.0.26 (die ursprüngliche Version auf einem SLES10) ausrollen, und da hatte ich Probleme mit
SELECT
irgendeinausdruck AS created -- Datentyp DATETIME
FROM blah
ORDER BY IFNULL(created, '2100-01-01 00:00:00') -- Q&D: die ohne created Zeitstempel nach hinten sortieren
Das war ein Fehler, wahrscheinlich der da: <http://bugs.mysql.com/bug.php?id=22457>, also im Zusammenhang mit Aliasnamen in Expressions. Prinzipiell sind ja Aliasnamen in der Order-By-Klausel möglich. Der Fehler wurde in [Version 5.0.32](http://dev.mysql.com/doc/refman/5.0/en/news-5-0-32.html) behoben (auf der verlinkten Seite nach "alias" suchen).
Lo!
Tach auch.
Das war ein Fehler, wahrscheinlich der da: http://bugs.mysql.com/bug.php?id=22457, also im Zusammenhang mit Aliasnamen in Expressions. Prinzipiell sind ja Aliasnamen in der Order-By-Klausel möglich. Der Fehler wurde in Version 5.0.32 behoben (auf der verlinkten Seite nach "alias" suchen).
Erstmal danke für die Informationen. Da ich das Statement als syntaktisch richtig angesehen habe und es auf einer späteren Version ja auch lief, war das allerdings zu vermuten.
Mein Einwand an die Diskussion war: ja, eigentlich sollten solche Dinge in MySQL funktionieren. Praktisch gibt es halt Fallstricke, die das verhindern (eben z.B. eine alte MySQL Version mit einem Bug).
Bis die Tage,
Matti
ich hab jetzt
"SELECT user, money, konto IF(konto >= 0,(money + konto) AS cash, money AS cash) FROM ".TBL_STATS." ORDER BY cash DESC LIMIT 10"
sollte das funktionieren? bei mir funzt es leider net, wie könnte ich das sonst machen???
Hallo,
"SELECT user, money, konto IF(konto >= 0,(money + konto) AS cash, money AS cash) FROM ".TBL_STATS." ORDER BY cash DESC LIMIT 10"
sollte das funktionieren? bei mir funzt es leider net, wie könnte ich das sonst machen???
Du möchtest den Spaltenaliasnamen für den gesamten IF-Ausdruck verwenden und nicht für die Teilausdrücke.
SELECT
user,
money,
konto -- hier fehlt bei Dir ein Komma
-- müsste zu einer entsprechenden Fehlermeldung führen.
-- *Ich* verwende *nie* AS um einen Spaltenaliasnamen zu kennzeichnen
-- weil es nicht nur optional ist, sondern in manchen DBMS gar nicht
-- erlaubt ist.
IF( konto >= 0, (money + konto), money ) cash
FROM
tabelle
ORDER BY
cash
DESC
LIMIT
10
Siehe auch Handbuch, Problems with column aliases.
Freundliche Grüße
Vinzenz
Hi!
das ich LIMIT und ORDER BY vertauscht hatte hab ich eben schon beim Testen gemerkt und geändert,
Wenn du sowieso testest, warum testest du nicht gleich, ob die Anfrage das von dir erwartete Ergebnis und keinen Systaxerrror wirft?
Lo!
achso nochwas ganz wichtig
Beispiel wenn jetzt bar -1 wäre und ich die berechnung dann nicht ausführen wollte
quasi als if bar == -1 dann nimm nur konto und nicht konto + bar
udn if konto == -1 dann nimm nur bar und nicht konto + bar