Ahnungsloser: MySQL WHERE oder ORDER BY Klausel mit Berechnung möglich???

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!

  1. 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, kontoFROMmoneytable ORDER BY (bar+konto) DESC LIMIT 10;

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix

    1. 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

      1. Hey,

        schau mal in die MySQL-Dokumentation.

        Gruß, Dennis

        1. 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??

          1. Moin!

            nochmal zu der if abfrage, kann ich das auch in die ORDER BY klausel
            auslagern??

            Nein.

            MFFG (Mit freundlich- friedfertigem Grinsen)

            fastix

            1. 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!

              1. 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_3FROMtab_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

                1. 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 ...

                  1. 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!

                    1. 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

                      1. 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

                        1. Moin!

                          * Lass Dir den sql-String ausgeben. (echo "<pre>$sql</pre>";

                          echo '<pre>' . htmlentities($sql) . '</pre>';
                          natürlich.

                          MFFG (Mit freundlich- friedfertigem Grinsen)

                          fastix

              2. 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

                1. 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!
                  
                  1. 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

        2. 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???

          1. 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

      2. 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!

    2. 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