MySQL - kompliziertes Select

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • MySQL - kompliziertes Select

    Hallo php-resource Forum!

    Ursprünglich habe ich bei einem GildenChat die letzten 20 Einträge selektiert und sie aufsteigend sortiert:
    Code:
    SELECT * 
    FROM guild_chat 
    WHERE chatID > ((select max(chatID) from guild_chat)-20) 
    AND GuildID=1 
    ORDER BY chatID ASC 
    LIMIT 20
    Das ging soweit gut, jetzt kommen aber Einträge von anderen Gilden hinzu. heisst: Ich kann nicht mehr nach der ID gehen, sondern muss sonstwie die letzten 20 Einträge der jeweiligen Gilde auslesen können.

    Kann ich das irgendwie mit 2 Order by's durch Gruppieren lösen? (erster order by mit limit liest die letzten 20 zeilen aus mit ID=xy, zweiter sortiert sie aufsteigen)?

    Danke im Voraus für eure Hilfe

    MfG
    Onyxagargaryll

    PS: chatID ist auto_increment

  • #2
    Dein WHERE in Kombination mit dem LIMIT ist ziemlich banane. Offensichtlich zeichnen sich die letzten 20 Einträge dadurch aus, dass sie die größten ChatIDs haben.

    SELECT ... FROM ... ORDER BY ChatID DESC LIMIT 20

    liefert dir ebenfalls die letzten 20 Einträge, lediglich in anderer Reihenfolge, die du aber PHP-seitig umkehren kannst.


    Zu deiner Frage: Man kann ein einer Query nicht zweimal ORDER BY schreiben. Allerdings darf man mehrere Sortierkriterien angeben (ORDER BY x, y). Versuch doch einfach mal was und poste, wenn du nicht weiterkommst.

    Kommentar


    • #3
      PS: chatID ist auto_increment
      geht das nicht auch mit MySQL?

      Naja so was könnt ich schon machen...:
      Code:
      SELECT * 
      FROM guild_chat 
      WHERE GuildID=1 
      ORDER BY chatID DESC 
      LIMIT 20
      das wäre dann einfach die falsche Reihenfolge...

      Also bitte ich um ein kurzes "ja" wenn sowas nur in Verbindung mit PHP funktioniert

      Danke und MfG
      Onyx

      Kommentar


      • #4
        Was heißt "nur in Verbindung mit PHP"? Es funktioniert doch, MySQL macht doch was du willst oder nicht?!

        Wenn du die Reihenfolge umdrehen willst, kannst du das in PHP machen, z.B. alles in ein Array lesen und das Array von hinten nach vorn ausgeben. Du kannst es aber auch MySQL umdrehen lassen:

        SELECT * FROM (deine Query) AS x ORDER BY x.ChatID ASC

        Kommentar


        • #5
          das wären ja dann wieder die 2 order bys

          egal ich machs mit php.


          Danke für die Hilfe, wünsche noch einen schönen Tag!

          MfG
          Onyx

          Kommentar


          • #6
            Original geschrieben von Onyxagargaryll
            das wären ja dann wieder die 2 order bys
            Eins steckt in der Subquery. Das ist natürlich erlaubt. Falls du das meintest, hatte ich dich misverstanden.
            Übrigens ist das zweite ORDER BY, das in der äußeren Query total harmlos, denn die innere Query gibt niemals mehr als 20 Tupel zurück. Die kann MySQL in Nullkommanix sortieren. Da dauert das Analysieren und Optimieren der verschachtelten Queries zu Beginn sicher länger.
            Zuletzt geändert von onemorenerd; 30.05.2008, 12:14.

            Kommentar


            • #7
              Um alle Missverständnissen entgegenzukommen:
              Ich wollte folgendes...

              Code:
              (
              SELECT *
              FROM `guild_chat`
              WHERE GuildID =1
              ORDER BY chatID DESC
              LIMIT 10
              )
              ORDER BY chatID ASC

              MfG
              Onyx

              Kommentar


              • #8
                Das ist sematisch äquivalent zu dem bereits empfohlenen
                Code:
                SELECT * FROM (
                SELECT *
                FROM `guild_chat`
                WHERE GuildID =1
                ORDER BY chatID DESC
                LIMIT 10
                ) AS x
                ORDER BY x.chatID ASC
                Diese ausgeschriebene Variante ist übrigens eher korrektes SQL. Vermutlich expandiert MySQL auch so vor der Ausführung.

                Kommentar


                • #9
                  Vermutlich expandiert MySQL auch so vor der Ausführung
                  Keine Ahnung, in der Richtung wird zumindest nichts angezeigt...


                  Aber zu dem schöneren Statement danke ich herzlich

                  MfG
                  Onyx

                  Kommentar


                  • #10
                    Die EXPLAINs beider Queries sind tatsächlich verschieden, also war meine Vermutung wohl falsch und wenn du Lust hast, kannst du ja mal testen, welche Query schneller ist.

                    Ich bleibe aber bei der Behauptung, dass die ausführlichere Query korrektes SQL ist und die kurze erst von MySQL korrigiert werden muss. Beweisen kann ich das zwar nicht, aber es gibt Indizien:
                    Ich kann die kurze Query mit der SQL-Grammatik gar nicht ableiten, finde keinen Anfang für den Klammerausdruck. Vielleicht jemand anders? (http://savage.net.au/SQL/sql-99.bnf....f-left%20paren)
                    Ein weiteres Indiz: http://www.wangz.net/cgi-bin/pp/gsql.../sqlformat.tpl mag die kurze Query nicht, die lange wird akzeptiert.
                    Zuletzt geändert von onemorenerd; 10.06.2008, 14:55.

                    Kommentar

                    Lädt...
                    X