Hattrix: SELECT bei phpBB-Forum

Hallo,

  
SELECT phpbb_topics.topic_title,phpbb_topics.topic_views,phpbb_topics.topic_id FROM phpbb_topics INNER JOIN phpbb_posts ON phpbb_topics.topic_id=phpbb_posts.topic_id GROUP BY phpbb_posts.topic_id ORDER BY post_time DESC LIMIT 5  

Damit will ich die letzten 5 Beiträge meines Forums selektieren, aber das haut vorn und hinten nicht hin. Sprich, die Sortierung stimmt nicht. Wo ist mein Fehler?

  1. Hi,

    SELECT phpbb_topics.topic_title,phpbb_topics.topic_views,phpbb_topics.topic_id FROM phpbb_topics INNER JOIN phpbb_posts ON phpbb_topics.topic_id=phpbb_posts.topic_id GROUP BY phpbb_posts.topic_id ORDER BY post_time DESC LIMIT 5

    
    >   
    > Damit will ich die letzten 5 Beiträge meines Forums selektieren, aber das haut vorn und hinten nicht hin. Sprich, die Sortierung stimmt nicht. Wo ist mein Fehler?  
      
    Nur eine Vermutung, aber kann es sein, dass post\_time nur eine Zeit ist, und kein Datum beinhaltet?  
      
    Ansonsten waere vielleicht eine genauere Beschreibung hilfreich.  
      
    mfG,  
    steckl
    
    1. Hi,

      SELECT phpbb_topics.topic_title,phpbb_topics.topic_views,phpbb_topics.topic_id FROM phpbb_topics INNER JOIN phpbb_posts ON phpbb_topics.topic_id=phpbb_posts.topic_id GROUP BY phpbb_posts.topic_id ORDER BY post_time DESC LIMIT 5

      
      > >   
      > > Damit will ich die letzten 5 Beiträge meines Forums selektieren, aber das haut vorn und hinten nicht hin. Sprich, die Sortierung stimmt nicht. Wo ist mein Fehler?  
      >   
      > Nur eine Vermutung, aber kann es sein, dass post\_time nur eine Zeit ist, und kein Datum beinhaltet?  
      >   
      > Ansonsten waere vielleicht eine genauere Beschreibung hilfreich.  
      >   
      > mfG,  
      > steckl  
        
      Timestamp wird eingefügt!
      
  2. Hi,

    SELECT phpbb_topics.topic_title,phpbb_topics.topic_views,phpbb_topics.topic_id FROM phpbb_topics INNER JOIN phpbb_posts ON phpbb_topics.topic_id=phpbb_posts.topic_id GROUP BY phpbb_posts.topic_id ORDER BY post_time DESC LIMIT 5

      
    Was soll das GROUP BY darin? Die Spaltenliste enthält Spalten, nach denen nicht gruppiert sind und die auch keine Gruppenfunktion sind.  
      
    cu,  
    Andreas
    
    -- 
    [Warum nennt sich Andreas hier MudGuard?](http://MudGuard.de/)  
    [O o ostern ...](http://ostereier.andreas-waechter.de/)  
      
    Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.  
    
    
    1. Hi,

      SELECT phpbb_topics.topic_title,phpbb_topics.topic_views,phpbb_topics.topic_id FROM phpbb_topics INNER JOIN phpbb_posts ON phpbb_topics.topic_id=phpbb_posts.topic_id GROUP BY phpbb_posts.topic_id ORDER BY post_time DESC LIMIT 5

      
      >   
      > Was soll das GROUP BY darin? Die Spaltenliste enthält Spalten, nach denen nicht gruppiert sind und die auch keine Gruppenfunktion sind.  
      >   
      > cu,  
      > Andreas  
        
      Das GROUP BY hat den Zweck, wenn unter den ersten 5 Einträge doppelt drin sind und diese eben zusammenfügt.
      
      1. yo,

        Das GROUP BY hat den Zweck, wenn unter den ersten 5 Einträge doppelt drin sind und diese eben zusammenfügt.

        was du suchst nennt sich DISTINCT und nicht GROUP BY. jedes andere dbms ausser mysql würde bei deiner abfrage einen fehler ausgeben.

        Ilja

        1. yo,

          Das GROUP BY hat den Zweck, wenn unter den ersten 5 Einträge doppelt drin sind und diese eben zusammenfügt.

          was du suchst nennt sich DISTINCT und nicht GROUP BY. jedes andere dbms ausser mysql würde bei deiner abfrage einen fehler ausgeben.

          Ilja

          Leider wird da auch nicht richtig sortiert! :(

          1. Hi,

            Leider wird da auch nicht richtig sortiert! :(

            Lass dir doch mal post_time mit anzeigen.

            Wie sieht dein Query jetzt aus? und wie das Ergebnis dazu?

            mfG,
            steckl

            1. Ich merke gerade, dass "post_time" die Zeit ist, wann der Thread erstellt wurde, und nicht, wie ich dachte, in welchem Thread der letzte Eintrag gemacht wurde.

              Aber die steht doch in der Tabelle "phpbb_posts"? Da muss ich wohl weiter nach Zeitfeldern suchen!

              1. Nee doch nicht. Ich habe nach der "phpbb_topics.topic_title" DISTINCT und nach "post_id" sortiert. Nehme ich DISTINCT oder GROUP BY raus, funktioniert alles ohne Probleme, außer eben, dass die doppelten Einträge drin sind.

                SQL:
                SELECT phpbb_topics.topic_title,phpbb_topics.topic_views,phpbb_topics.topic_id,post_id FROM phpbb_topics INNER JOIN phpbb_posts ON phpbb_topics.topic_id=phpbb_posts.topic_id ORDER BY post_id DESC LIMIT 5

                Ausgabe:
                Thread 6,24,6,11
                Thread 5,40,5,10
                Thread 3,34,5,9
                Thread 5,40,5,8
                Thread 4,23,5,7
                Thread 1,51,5,6

                Da "Thread 5" zweimal drin ist, soll "Thread 5" nur einmal erscheinen und eben "Thread 1" nachrücken, da "Limit 5"! Wie muss ich das SELECT nun umbauen? Mit DISTINCT und GROUP BY funktioniert das nicht!

                1. Hi,

                  Da "Thread 5" zweimal drin ist, soll "Thread 5" nur einmal erscheinen und eben "Thread 1" nachrücken, da "Limit 5"! Wie muss ich das SELECT nun umbauen? Mit DISTINCT und GROUP BY funktioniert das nicht!

                  Sicher?
                  Sollte eigentlich mit "group by post_id" und "having max(post_time)" klappen.

                  mfG,
                  steckl

                  1. Hallo Stefan,

                    Da "Thread 5" zweimal drin ist, soll "Thread 5" nur einmal erscheinen und eben "Thread 1" nachrücken, da "Limit 5"! Wie muss ich das SELECT nun umbauen? Mit DISTINCT und GROUP BY funktioniert das nicht!

                    Sicher?
                    Sollte eigentlich mit "group by post_id" und "having max(post_time)" klappen.

                    das ist meiner Meinung nach ein schlechter Ratschlag. Solches SQL akzeptiert nur MySQL. Nur unter bestimmten Bedingungen (die hier allerdings gegeben sein sollten) gibt es das gewünschte Ergebnis. Ich zitiere aus dem Handbuch:

                    <zitat>
                    In standard SQL, you would have to add customer.name to the GROUP BY clause. In MySQL, the name is redundant.

                    Do not use this feature if the columns you omit from the GROUP BY part are not constant in the group. The server is free to return any value from the group, so the results are indeterminate unless all values are the same.
                    </zitat>

                    Genau dieses "Do not use this feature ..." führt hier im Forum zu ständigen Fragen, weil es mißachtet wird. Ich persönlich bevorzuge die Formulierung:

                    "Do not use this feature at all."

                    Freundliche Grüße

                    Vinzenz

                    1. SELECT phpbb_topics.topic_title,phpbb_topics.topic_views,phpbb_topics.topic_id FROM phpbb_topics INNER JOIN phpbb_posts ON phpbb_topics.topic_id=phpbb_posts.topic_id GROUP BY phpbb_topics.topic_id HAVING max(post_time) LIMIT 5

                      Damit erhalte ich gar keine Ausgabe!

                    2. Hi,

                      Sollte eigentlich mit "group by post_id" und "having max(post_time)" klappen.

                      das ist meiner Meinung nach ein schlechter Ratschlag.

                      Bei mir hat es so bis jetzt immer geklappt. Darum bin ich davon ausgegangen, dass man das so macht, was offenbar ein Irrtum war.

                      Solches SQL akzeptiert nur MySQL. Nur unter bestimmten Bedingungen (die hier allerdings gegeben sein sollten) gibt es das gewünschte Ergebnis. Ich zitiere aus dem Handbuch:

                      In standard SQL, you would have to add customer.name to the GROUP BY clause. In MySQL, the name is redundant.

                      Heisst das nur, dass man statt "post_id" "Tabelle.post_id" schreiben sollte?

                      Diese beiden Saetze verstehe ich ueberhaupt nicht:

                      Do not use this feature if the columns you omit from the GROUP BY part are not constant in the group.

                      Spalten, die ich ausschliesse, sollen nicht konstant sein? Was heisst das?

                      The server is free to return any value from the group, so the results are indeterminate unless all values are the same.

                      Ist nicht genau darum HAVING da, damit der Server nicht einen beliebigen Wert zurueckgibt?

                      Genau dieses "Do not use this feature ..." führt hier im Forum zu ständigen Fragen, weil es mißachtet wird. Ich persönlich bevorzuge die Formulierung:

                      "Do not use this feature at all."

                      Gibt es eine elegantere Alternative dazu?

                      mfG,
                      steckl

                      1. Hallo

                        Sollte eigentlich mit "group by post_id" und "having max(post_time)" klappen.

                        das ist meiner Meinung nach ein schlechter Ratschlag.

                        Bei mir hat es so bis jetzt immer geklappt. Darum bin ich davon ausgegangen, dass man das so macht, was offenbar ein Irrtum war.

                        Solches SQL akzeptiert nur MySQL. Nur unter bestimmten Bedingungen (die hier allerdings gegeben sein sollten) gibt es das gewünschte Ergebnis. Ich zitiere aus dem Handbuch:

                        In standard SQL, you would have to add customer.name to the GROUP BY clause. In MySQL, the name is redundant.

                        Heisst das nur, dass man statt "post_id" "Tabelle.post_id" schreiben sollte?

                        Nein, das heißt:

                        GROUP BY
                            post_id,
                            topic_title,
                            topic_views

                        (natürlich mit qualifizierten Spaltennamen)

                        Diese beiden Saetze verstehe ich ueberhaupt nicht:

                        Lies bitte den gesamten Abschnitt:
                        http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-fields.html.

                        Genau dieses "Do not use this feature ..." führt hier im Forum zu ständigen Fragen, weil es mißachtet wird. Ich persönlich bevorzuge die Formulierung:

                        "Do not use this feature at all."

                        Gibt es eine elegantere Alternative dazu?

                        Für mich gibt es nichts eleganteres als syntaktisch korrekt nach allen Spalten zu gruppieren, auf die keine Aggregatsfunktion angewandt wird.

                        Eine kleine Auswahl an Archivthreads, -postings zu dem Problem:

                        </archiv/2005/9/t114802/#m732596>
                        </archiv/2005/8/t114337/#m728686>
                        </archiv/2005/7/t111779/#m704775>
                        </archiv/2005/5/t108614/#m676691>
                        </archiv/2006/3/t126470/#m815637>
                        </archiv/2006/4/t128026/#m826492>
                        </archiv/2006/7/t133015/#m861544>
                        </archiv/2006/8/t134684/#m873861>
                        </archiv/2006/9/t136102/#m883661>

                        Freundliche Grüße

                        Vinzenz

                        1. Hi,

                          Eine kleine Auswahl an Archivthreads, -postings zu dem Problem:

                          </archiv/2005/9/t114802/#m732596>
                          </archiv/2005/8/t114337/#m728686>
                          </archiv/2005/7/t111779/#m704775>
                          </archiv/2005/5/t108614/#m676691>
                          </archiv/2006/3/t126470/#m815637>
                          </archiv/2006/4/t128026/#m826492>
                          </archiv/2006/7/t133015/#m861544>
                          </archiv/2006/8/t134684/#m873861>
                          </archiv/2006/9/t136102/#m883661>

                          Danke fuer deine Muehe.

                          mfG,
                          steckl

                          1. Was wird aus meinem Problem?

                            SELECT phpbb_topics.topic_title,phpbb_topics.topic_views,phpbb_topics.topic_id FROM phpbb_topics INNER JOIN phpbb_posts ON phpbb_topics.topic_id=phpbb_posts.topic_id GROUP BY phpbb_topics.topic_id HAVING max(post_time) LIMIT 5

                            Damit erhalte ich gar keine Ausgabe!

                            1. yo,

                              Damit erhalte ich gar keine Ausgabe!

                              wie auch, erstens versuche das problem mit dem group by und den ausgegeben spalten zu verstehen und zweitens muss du das:

                              HAVING max(post_time) durch das :

                              HAVING max(post_time) = post_time ersetzen

                              Ilja

                              1. yo,

                                mal davon abgesehen, dass hier gruppierung wohl nicht angebracht ist, sondern meiner meinung nach unterabfragen...

                                Ilja

                                1. Und was mache ich nun? Bekomme kein richtiges SELECT hin! :(

                    3. yo,

                      Ich persönlich bevorzuge die Formulierung:
                      "Do not use this feature at all."

                      ich würde sagen, "it's a bug, not a feature" ;-)

                      Ilja