hattrix: PHP, MYSQL Sortieren

Hallo,

folgendes:

Select-Abfrage: SELECT ... ORDER BY user.punkte DESC ...

php-Datei:
Habe 3 Spalten (table)

1.Spalte:
Name

2.Spalte:
if (wert==x) echo $row['punkte'];
if (wert==x) echo $row['punkte']/2;
if (wert==x) echo $row['punkte']/4;

3.Spalte:
echo $row['punkte'];

Jetzt sortiert er nach Spalte 3, aber wie lasse ich nach Spalte 2 sortieren?

Gruß
Hattrix

  1. hi,

    Jetzt sortiert er nach Spalte 3, aber wie lasse ich nach Spalte 2 sortieren?

    Drücke dich bitte klar aus - wonach willst du sortieren?

    2.Spalte:
    if (wert==x) echo $row['punkte'];
    if (wert==x) echo $row['punkte']/2;
    if (wert==x) echo $row['punkte']/4;

    Wenn x jedes mal einen unterschiedlichen Wert haben soll, du also mal die vollen Punkte, mal auch nur die halben oder ein Viertel ausgeben willst, dann sag das bitte auch dazu.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Es wird gerade nach dem Feld "user.punkte" sortiert, sprich Spalte 3 in der Tabelle in der PHP-Datei.

      Die Spalte 2 hat if-Abfragen, wo x immer ein anderen Wert hat. Dadurch werden die "user.punkte" neu berechnet. Und danach soll sortiert werden.

      Bsp: http://hattrix.tida-world.de/bwarteliste.php

      1. hi,

        Es wird gerade nach dem Feld "user.punkte" sortiert, sprich Spalte 3 in der Tabelle in der PHP-Datei.

        Es wird bereits sortiert, bevor auch nur irgendwas in PHP ankommt oder ein einer HTML-Tabelle landet.

        Die Spalte 2 hat if-Abfragen, wo x immer ein anderen Wert hat.

        Geht's etwas genauer? Ist x zufallsabhängig, oder was ...?

        Dadurch werden die "user.punkte" neu berechnet. Und danach soll sortiert werden.

        Wenn der Datenbank die Berechnung noch nicht bekannt ist, kann sie schwerlich danach eine Sortierung vornehmen - das sollte einleuchtend sein.
        Dann wäre die Sortierung ggf. erst Scriptseitig vorzunehmen - alle Werte von der DB zuerst in ein Array packen, Berechnungen durchführen, sortieren, ausgeben.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. x hat 3 Werte ...  1, 2 und 3 ...

          Wie mache ich das mit dem array?

          1. hi,

            x hat 3 Werte ...  1, 2 und 3 ...

            Und welchen davon wann?
            Besteht irgendeine Abhängigkeit bzw. ein Zusammenhang mit den Daten aus der DB, so dass diese die Berechnung oder Unterscheidung bereits durchführen könnte.

            Wie mache ich das mit dem array?

            Ich lese im Manual nach, und informiere mich.

            gruß,
            wahsaga

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. Ja, kommt aus der DB. Sorry!

              "wert" ist gleich $row['wert'] und "x" ist dann eben gleich der Wert, der dort drin steht. Also in $row['wert'] sind nur zahlen von 1 bis 3 vorhanden!

              1. Hi,

                "wert" ist gleich $row['wert'] und "x" ist dann eben gleich der Wert, der dort drin steht. Also in $row['wert'] sind nur zahlen von 1 bis 3 vorhanden!

                Wenn ich dich richtig verstehe ist x das gleiche wie wert.
                Das macht aber keinen Sinn, denn somit ist ja "if(wert==x)" immer true.
                meinst du "if(wert==1) ... if(wert==2) ... if(wert==3)"?

                mfG,
                steckl

                1. "wert" ist der Feldname der DB. Daher ist er immer gleich. Halt der Feldname "Wert". In diesem Feldname gibt es halt 3 verschiedene Zahlen, die ich abfrage. Je nachdem was drin steht, geht die if-abfrage rein!

              2. Hallo hattrix,

                "wert" ist gleich $row['wert'] und "x" ist dann eben gleich der Wert, der dort drin steht. Also in $row['wert'] sind nur zahlen von 1 bis 3 vorhanden!

                Mit

                SELECT  
                   ...,  
                   punkte / [link:http://dev.mysql.com/doc/refman/4.1/en/mathematical-functions.html#id2735718@title=POW](2, wert - 1) AS PunkteGewichtet  
                FROM ...
                

                bzw.

                punkte * POW(2, 1 - wert) AS PunkteGewichtet

                kannst Du die Berechnung gleich vom DBMS vornehmen lassen. Zum Verständnis der Berechnungsformel sind Kenntnisse in der Potenzrechnung hilfreich.

                Freundliche Grüße

                Vinzenz

                1. was ist aber, wenn "x" auch Buchstaben enthält?

                  1. hi,

                    was ist aber, wenn "x" auch Buchstaben enthält?

                    Dann erzählt uns hattrix hier einen Scheiss nach dem anderen, weil er uns gerade eben noch weismachte,

                    "wert" ist gleich $row['wert'] und "x" ist dann eben gleich der Wert, der dort drin steht. Also in $row['wert'] sind nur zahlen von 1 bis 3 vorhanden!

                    dass es sich nur um die Zahlen von 1 bis 3 handele.

                    gruß,
                    wahsaga

                    --
                    /voodoo.css:
                    #GeorgeWBush { position:absolute; bottom:-6ft; }
                    1. Sorry, ich dachte, so ist mein Problem vielleicht einfacher zu verstehen! :-(

                      1. hi,

                        Sorry, ich dachte, so ist mein Problem vielleicht einfacher zu verstehen! :-(

                        Sich beim Fragen auf das Wesentliche zu beschränken, ist natürlich erwünscht. Wesentliches wegzulassen, ist aber nicht zielführend.

                        Gut, jetzt kann statt 1, 2 oder 3 also auch ein Buchstabe vorkommen.
                        Wie soll die Darstellung denn dann überhaupt erfolgen?
                        Das ist aus dem bisher bekannten noch gar nicht abzuleiten, da sich auch deine drei IF nur auf Zahlen/Ziffern bezogen.

                        gruß,
                        wahsaga

                        --
                        /voodoo.css:
                        #GeorgeWBush { position:absolute; bottom:-6ft; }
                        1. Ok, dann erkläre ich es genauer und ausführlicher:

                          $strSQL = "SELECT * FROM hattrix_user INNER JOIN hattrix_vereine ON hattrix_user.id_v = hattrix_vereine.id_v WHERE hattrix_user.status = 'liga' AND hattrix_user.spiele > '0' ORDER BY hattrix_user.punkte DESC";

                          while($row = mysql_fetch_row($result)) {
                          ?>
                          <table><tr><td>
                          <? // danach soll sortiert werden
                          if ($row[14] == '1.Bundesliga') {  echo $row[6]; }
                          if ($row[14] == '2.Bundesliga') {  echo $row[6]/2; }
                          if ($row[14] == 'Regionalliga Nord') {  echo $row[6]/4; }
                          if ($row[14] == 'Regionalliga Süd') {  echo $row[6]/4; }
                          ?>
                          </td></tr><tr><td>
                          <?
                          echo $row[6]; // danach wird derzeit sortiert
                          ?>
                          </td></tr></table>

                          }
                          ?>

                          // $row[14] = Feldname (liga) varchar
                          // $row[6] = Feldname (punkte) integer

                          1. Hallo hattrix,

                            if ($row[14] == 'Regionalliga Nord') {  echo $row[6]/4; }
                            if ($row[14] == 'Regionalliga Süd') {  echo $row[6]/4; }

                            sagte ich es nicht schon: Die nächste Ligenreform kommt bestimmt. Plane sie bereits ein :-)

                            Freundliche Grüße

                            Vinzenz

                            1. Da sich das bei mir um ein Online-game handelt, wird es keine Reform geben! Daher brauch ich jetzt schon diese Lösung!

                      2. Hallo

                        Sorry, ich dachte, so ist mein Problem vielleicht einfacher zu verstehen! :-(

                        Nein. Wenn Du in der Spalte "wert" irgendwelche Zeichenketten stehen hast, dann kann man natürlich nicht damit rechnen, das macht die Sache komplizierter.

                        Mit dem, was uns jetzt bekannt ist, könntest Du das wie folgt lösen:

                        SELECT  
                            ...,  
                            punkte / (  
                                [link:http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html@title=CASE]  
                                    WHEN wert = 'bla'   THEN 1  
                                    WHEN wert = 'blubb' THEN 2  -- Systematik sollte klar sein  
                                    ELSE 4  
                            ) AS PunkteGewichtet  
                            ...
                        

                        Das ist nicht schön, das ist nicht wirklich wartbar - weder in der DB noch im PHP-Code (falls Du es dort erledigen willst).
                        Du solltest daher Deine Datenbankstruktur überdenken. Führe z.B. eine Zuordnungstabelle mit der Zuordnung Deiner Zeichenketten zur entsprechenden Gewichtung ein, versehe diese Zuordnungstabelle mit einem künstlichen Schlüssel, speichere in der anderen Tabelle nur den Schlüsselwert und nicht den Text ab. Die nächste Ligenreform kommt bestimmt ;-)

                        Freundliche Grüße

                        Vinzenz

                        1. ... AS PunkteGewichtet

                          Muss ich da noch irgendwas im Quelltext ändern?

                          1. hi,

                            ... AS PunkteGewichtet

                            Muss ich da noch irgendwas im Quelltext ändern?

                            Schau dir erst mal an, was du damit herausbekommst - im phpMyAdmin, oder auch in dem du dir einen Datensatz im PHP-Script komplett anzeigen lässt (print_r/var_dump).

                            gruß,
                            wahsaga

                            --
                            /voodoo.css:
                            #GeorgeWBush { position:absolute; bottom:-6ft; }
                        2. SELECT

                          ...,
                              punkte / (
                                  [link:http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html@title=CASE]
                                      WHEN wert = 'bla'   THEN 1
                                      WHEN wert = 'blubb' THEN 2  -- Systematik sollte klar sein
                                      ELSE 4
                              ) AS PunkteGewichtet
                              ...

                            
                          Bringt mir damit ein Fehler in der darauffolgende While-Schleife.
                          
                          1. hi,

                            Bringt mir damit ein Fehler in der darauffolgende While-Schleife.

                            Muss man dir wieder erklären, dass eine Aussage "bringt mir (irgend-)einen Fehler" wenig taugt?

                            Tipps für Fragende

                            gruß,
                            wahsaga

                            --
                            /voodoo.css:
                            #GeorgeWBush { position:absolute; bottom:-6ft; }
                          2. Hallo

                            SELECT ...  
                               [link:http://dev.mysql.com/doc/refman/4.1/en/control-flow-functions.html@title=CASE]  
                                   WHEN wert = 'bla'   THEN 1  
                                   WHEN wert = 'blubb' THEN 2  -- Systematik sollte klar sein  
                                   ELSE 4  
                               END                             -- hatte ich vergessen :-)  
                               ) AS PunkteGewichtet  
                            
                            

                            Bringt mir damit ein Fehler in der darauffolgende While-Schleife.

                            Nein, schon vorher, d.h. bereits mysql_query() liefert einen Fehler zurück, den Du mit mysql_error() abfragen kannst, da ich in der Anweisung das END vergessen hatte - und die SQL-Anweisung somit syntaktisch falsch war. Allerdings solltest Du meinen Code auch nicht kritiklos abschreiben, sondern in der von mir extra verlinkten Doku nachlesen, was Du da machst. Dann hätte Dir meine Unterlassung auffallen können.

                            Grundsätzlich gilt, dass Du bei Anfragen an die DB _stets_ überprüfen solltest, ob das auch funktioniert hat - und den Fehlerfall geeignet behandeln.

                            Freundliche Grüße

                            Vinzenz