Marco: ORDER BY sortiert falsch

Hallöchen,

ich habe ein Problem mit der Sortierung von ORDER BY

Meine Abfrage lautet:

SELECT feld1, feld2, feld3, feld4 FROM tabelle1, tabelle2 WHERE tabelle1.pid = tabelle2.pid ORDER BY feld1, feld2, feld3 DESC

Und hier nochmal ORIGINAL:

  
SELECT goldStar, silverStar, bronzeStar, nick FROM stat_playerAwardMedals, stat_playerAtt WHERE stat_playerAwardMedals.pid = stat_playerAtt.pid ORDER BY goldStar, silverStar, bronzeStar DESC

Ausgegeben wird es mir so:

KLICK MICH

Ich habe keine Ahnung was ich falsch mache.

Eig. sollte er das so ausgeben:

feld1  feld2  feld3  feld4

10       10    10     user1
9        9     9      user2
8        8     8      user3
7        7     7      user4
usw.

Er sortiert aber nach ASC und denn auch noch Falsch.

Ich hoffe ihr habt eine Idee, was ich da Falsch mache.

Vielen Dank

mfg Marco

  1. SRY, habe vergessen meine MYSQL Version einzufügen.

    MySQL - 5.0.32-Debian_7etch10-log

    mfg

    Marco

  2. Er sortiert aber nach ASC und denn auch noch Falsch.

    Wieso falsch? Er sortiert nach ASC, und das macht er richtig. Da du leider keine Eintreäge hast, wo gold gleichoft vergeben ist... somit kann die zweite Sortierregel niemals eintreffen...

    Außerdem musst du ASC und DESC jedes mal vergeben, da sonst standardmäßig ASC verwendet wird:

    Siehe hier

    1. hi,

      Wieso falsch? Er sortiert nach ASC, und das macht er richtig. Da du leider keine Eintreäge hast, wo gold gleichoft vergeben ist... somit kann die zweite Sortierregel niemals eintreffen...

      Achso...
      Und wie bekomme ich jetzt alle 3 Felder sortiert?

      Vielen Dank

      mfg Marco

      1. Und wie bekomme ich jetzt alle 3 Felder sortiert?

        naja, (wurde ja schon geschrieben)

          
        ORDER BY  
          feld1 ASC,  
          feld2 DESC,  
          feld3 ASC,  
          feld4 DESC  
        
        

        Cheers, Frank

        1. hi,

          naja, (wurde ja schon geschrieben)

          ORDER BY
            feld1 ASC,
            feld2 DESC,
            feld3 ASC,
            feld4 DESC

            
            
          das dachte ich auch. Nur leider kommt da das gleiche Ergbenis raus.  
            
          SELECT feld1, feld2, feld3, feld4 FROM tabelle1, tabelle2 WHERE tabelle1.pid = tabelle2.pid ORDER BY feld1 DESC, feld2 DESC, feld3 DESC  
            
          Also es wird wieder nur feld1 Sortiert.  
            
          mfg Marco
          
          1. Also du Sortierung ist noch nicht ganz richtig.

            KLICK MICH

            1. Hi,

              Also du Sortierung ist noch nicht ganz richtig.
              KLICK MICH

              Sagst du uns bitte auch noch, wo das der Fall sein soll?

              MfG ChrisB

              --
              “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
              1. Hi,

                Also du Sortierung ist noch nicht ganz richtig.
                KLICK MICH

                Sagst du uns bitte auch noch, wo das der Fall sein soll?

                Klar...

                KLICK MICH

                mfg Marco

                1. Alles läuft richtig, das SQL ist richtig, MySQL interpretiert es auch korrekt .... lediglich du hast eine andere Logik. Warum sollten denn eis-tee92 und dark_voodoo026 andersherum ausgegeben werden?

                  Die Sortierung entscheidet sich bereits durch das Feld goldStar ...
                  Frank

                  1. Alles läuft richtig, das SQL ist richtig, MySQL interpretiert es auch korrekt .... lediglich du hast eine andere Logik. Warum sollten denn eis-tee92 und dark_voodoo026 andersherum ausgegeben werden?

                    Das soll eine Memberstatistik werden.

                    Ich möchte einfach nur, das die Felder goldStar, silverStar, bronzeStar einzelnt sortiert werden.

                    Sprich:

                    Feld : goldStar

                    10
                    9
                    8
                    7
                    6
                    5
                    4
                    3
                    2
                    1

                    Feld: silverStar

                    10
                    9
                    8
                    7
                    6
                    5
                    4
                    3
                    2
                    1

                    Feld: bronzeStar

                    10
                    9
                    8
                    7
                    6
                    5
                    4
                    3
                    2
                    1

                    Jedes Feld soll sortiert werden.

                    mfg Marco

                    1. Aha, also ein "Ranking" pro Spalte. "User X" liegt auf Platz 8 bei goldStar und auf Platz 10 bei bronzeStar. usw. Dann schau mal, ob dein DBMS solche Ranking-Funktionen unterstützt, imho gibts da nix in mySQL out-of-the-box.

                      Demnach hast du die Möglichkeiten:

                      • akzeptieren, wie es ist mit der Sortierung momentan
                      • eine eigene Ranking Funktionalität bauen (könnte unter mySQL etwas tricky sein, daher vielleicht eher mit PHP)
                      • eine vollständige Alternative suchen

                      Cheers, Frank

                      1. Aha, also ein "Ranking" pro Spalte. "User X" liegt auf Platz 8 bei goldStar und auf Platz 10 bei bronzeStar. usw. Dann schau mal, ob dein DBMS solche Ranking-Funktionen unterstützt, imho gibts da nix in mySQL out-of-the-box.

                        Demnach hast du die Möglichkeiten:

                        • akzeptieren, wie es ist mit der Sortierung momentan
                        • eine eigene Ranking Funktionalität bauen (könnte unter mySQL etwas tricky sein, daher vielleicht eher mit PHP)

                        Und wie kann ich es mit PHP sortieren. So sieht meine PHP Datei aus.

                        <?php  
                        $ergebnis=mysql_query("SELECT goldStar, silverStar, bronzeStar, nick FROM stat_playerAwardMedals, stat_playerAtt WHERE stat_playerAwardMedals.pid = stat_playerAtt.pid ORDER BY goldStar DESC");  
                        ?>  
                          
                          
                        //Goldmedaille  
                          
                        <table width="100%" border="1">  
                        <?php  
                        $nummer = 1;  
                        while ($row = mysql_fetch_assoc($ergebnis)) {  
                                echo '<tr>';  
                                echo '<td>'.$nummer++.'</td>'."\n";  
                                echo '<td>'.$row['goldStar'].'</td>'."\n";  
                        		echo '<td>'.$row['nick'].'</td>'."\n";  
                                echo '</tr>';  
                        }  
                        ?>  
                        </table>  
                          
                          
                        //Silbermedaille  
                          
                        <table width="100%" border="1">  
                        <?php  
                        $nummer = 1;  
                        mysql_result($ergebnis, silverStar);  
                        while ($row = mysql_fetch_assoc($ergebnis)) {  
                                echo '<tr>';  
                                echo '<td>'.$nummer++.'</td>'."\n";  
                                echo '<td>'.$row['silverStar'].'</td>'."\n";  
                        		echo '<td>'.$row['nick'].'</td>'."\n";  
                                echo '</tr>';  
                        }  
                        ?>  
                        </table>  
                          
                          
                          
                        //Bronzemedaille  
                          
                        <table width="100%" border="1">  
                        <?php  
                        $nummer = 1;  
                        mysql_result($ergebnis, bronzeStar);  
                        while ($row = mysql_fetch_assoc($ergebnis)) {  
                                echo '<tr>';  
                                echo '<td>'.$nummer++.'</td>'."\n";  
                                echo '<td>'.$row['bronzeStar'].'</td>'."\n";  
                        		echo '<td>'.$row['nick'].'</td>'."\n";  
                                echo '</tr>';  
                        }  
                        ?>  
                        </table>
                        

                        Wie wende ich darauf jetzt zb. sort() an?

                        Vielen Dank

                        mfg Marco

                    2. Hi,

                      Ich möchte einfach nur, das die Felder goldStar, silverStar, bronzeStar einzelnt sortiert werden.

                      Du willst also nicht eine Abfrage mit 3 Sortierungen, sondern 3 Abfragen mit je einer Sortierung.

                      cu,
                      Andreas

                      --
                      Warum nennt sich Andreas hier MudGuard?
                      O o ostern ...
                      Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
                      1. Hi,

                        Ich möchte einfach nur, das die Felder goldStar, silverStar, bronzeStar einzelnt sortiert werden.

                        Du willst also nicht eine Abfrage mit 3 Sortierungen, sondern 3 Abfragen mit je einer Sortierung.

                        Richtig, aber alles in einem query

                        mfg Marco

                        1. Hi,

                          Du willst also nicht eine Abfrage mit 3 Sortierungen, sondern 3 Abfragen mit je einer Sortierung.

                          Richtig, aber alles in einem query

                          UNION

                          MfG ChrisB

                          --
                          “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
            2. Nun, hast du es jetzt oder was willst du denn genau erreichen, der erstes Wunschbeispiel mit 10 10 10 ist ein bisschen zu banal.

              ein ~~~sql

              ORDER BY
                feld1 DESC,
                feld2 DESC

                
              sortiert alle Datensätze zuerst nach "feld1" absteigend, dann für alle Datensätze, die einen gleichen Wert für "feld1" haben absteigend nach feld2 usw.  
                
              Frank
              
              1. hi,

                Nun, hast du es jetzt oder was willst du denn genau erreichen, der erstes Wunschbeispiel mit 10 10 10 ist ein bisschen zu banal.

                ein ~~~sql

                ORDER BY
                  feld1 DESC,
                  feld2 DESC

                
                >   
                > sortiert alle Datensätze zuerst nach "feld1" absteigend, dann für alle Datensätze, die einen gleichen Wert für "feld1" haben absteigend nach feld2  
                  
                Ich möchte das er jeden Feld für sich sortiert.  
                  
                Also nicht nach einander und auch nicht nur dann wenn gleiche da sind.  
                  
                mfg Marco
                
                1. Ich möchte das er jeden Feld für sich sortiert.

                  und was soll da dann rauskommen? das kann nicht gehen. Dann wüsste die Datenbank nicht, an welcher Stelle es den Datensatz nun liefern soll, für goldStar käme er an 10. Stelle für silverStar an 15. und für bronzeStar an 4. Wie würdest du denn dann entscheiden?

                  Du möchtest vielleicht lieber ein sogenanntes "Ranking" pro Spalte erstellen. Damit bekommst du aber auch nur wieder andere Zahlen, mit denen du dasselbe Problem haben wirst.

                  Oder du möchtest vielleicht ein gewichtetes "Gesamtranking" (mit sog. tie-breaker) machen. Das ginge, indem du z.b. goldStar die doppelte Wertigkeit (z.b. 6 Punkte) gibst als silverStar (3 Punkte) und die 6fache Wertigkeit von bronzeStar gibst:

                  ORDER BY (goldStar*6 + silverStar*3 + bronzeStar*1) DESC

                  Das ist nicht ganz trivial und nur eine von schier Millionen von Möglichkeiten.

                  Die NULL-Werte bekommst du raus, indem du die Funktion COALESCE(feld, surrogatwert_wenn_null) anwendest.

                  Cheers, Frank

                  1. und was soll da dann rauskommen? das kann nicht gehen. Dann wüsste die Datenbank nicht, an welcher Stelle es den Datensatz nun liefern soll, für goldStar käme er an 10. Stelle für silverStar an 15. und für bronzeStar an 4. Wie würdest du denn dann entscheiden?

                    Du möchtest vielleicht lieber ein sogenanntes "Ranking" pro Spalte erstellen. Damit bekommst du aber auch nur wieder andere Zahlen, mit denen du dasselbe Problem haben wirst.

                    Richtig es soll ein Ranking werden.

                    KLICK MICH

                    Ganz unten siehst du die Medaillen GOLD, SILBER und BRONZE.
                    Geh mal mit der Maus drüber, dann siehst du mein Ranking.

                    Nur wie bekomme ich das jetzt sortiert?

                    mfg Marco

                    1. Hi,

                      Ganz unten siehst du die Medaillen GOLD, SILBER und BRONZE.
                      Geh mal mit der Maus drüber, dann siehst du mein Ranking.

                      Nur wie bekomme ich das jetzt sortiert?

                      https://forum.selfhtml.org/?t=192387&m=1283881

                      MfG ChrisB

                      --
                      “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]