Tabellenübergreifend sortieren

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

  • Tabellenübergreifend sortieren

    Hallo
    Ich habe ein Forum gebastelt:
    Aufbau
    Tab1: Forum_foren --> Foren
    Tab2: Forum_bei ---> Beiträge
    Tab3: Forum_ans ---> Antworten auf die Beiträge

    Funktioniert bereits ausgezeichnet, außer die Sortierung der Einträge.
    Die Ausgabe erfolgt in einer Tabelle wobei in der letzten Spalte das
    "Letzter Beitrag von:" steht.

    Nun möchte ich alle meine Beiträge so sortieren dass der Eintrag mit dem letzten Eintrag ganz oben steht ?
    Bei einem Join werden mir alle Beitrage sooft angezeigt wie antworten vorhanden sind ?

    Momentaner Code:
    PHP-Code:
    $sql "SELECT * from forum_bei 
                
                WHERE fk_forenid='"
    .$_GET['showforum']."' ORDER BY datum DESC";
        
    $query mysql_query($sql);
        
    //Alle Beiträge von diesem Forum rausholen
        
    if(mysql_num_rows($query) == 0)
            echo 
    '<tr>
                    <td colspan="5" class="titel" style="border-left:1px solid; padding:10px;" align="center">
    Kein Eintrag in diesem Forum!</td>
                  </tr>'
    ;
        
        while ( 
    $row mysql_fetch_array($query) )
        {
            
    $sql "SELECT *,
                             date_format(datum,'%H:%i') as fdatum,
                             date_format(datum,'%d.%m.%Y') as ffdatum
                             from forum_ans WHERE fk_beitragid="
    .$row['id']." ORDER BY datum DESC";
            
    $anzahl mysql_query($sql);
            
    $name mysql_fetch_array($anzahl);
            
            echo 
    '<tr onmouseover="style.backgroundColor=\'#FFE4B5\'" onmouseout="style.backgroundColor=\'transparent\'">
                    <td style="border-left:1px solid;"><img src="images/16x16/bei.gif"></td>
                    <td><a href="?site=forum&forum='
    .$_GET['showforum'].'&show='.$row['id'].'" style="color:#000;">'.$row['titel'].'</a></td>
                    <td align="center">'
    .$row['counter'].'</td>
                    <td align="center">'
    .(mysql_num_rows($anzahl)-1).'</td>
                    <td>Von <b>'
    .name($name['fk_userid']).'</b><br/>um <b>'.$name['fdatum'].'</b> am '.$name['ffdatum'].'</td>
                  </tr>'
    ;
        }
        echo 
    '</table></p> 

  • #2
    1.) Man selected nicht alles respektive nicht mit *
    2.) GROUP BY
    [FONT="Helvetica"]twitter.com/unset[/FONT]

    Shitstorm Podcast – Wöchentliches Auskotzen

    Kommentar


    • #3
      Original geschrieben von unset
      2.) GROUP BY
      Ist aber nicht die Lösung des Problems...

      Man muss sortieren vor dem Gruppieren und das kann MySQL einfach nicht.
      Irgendwo existiert afaik ein Workaround mit JOIN oder so ... Suchfunktion hilft~ wurde afaik mal irgendwann irgendwo gepostet.

      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
      Wie man Fragen richtig stellt

      Kommentar


      • #4
        Code:
        SELECT
          feld
        FROM 
          tabelle
        GROUP BY
          gruppierungsfeld
        ORDER BY
          sortierfeld
        ASC
        Soll nicht gehen?
        [FONT="Helvetica"]twitter.com/unset[/FONT]

        Shitstorm Podcast – Wöchentliches Auskotzen

        Kommentar


        • #5
          Doch, aber schau dir den Post doch mal genau an.

          1. Er liest alle Beiträge aus
          2. Er liest in der Schleife die letzten Beiträge aus.

          Das ist schon potentiell schlecht - Query in einer Schleife - wenn man also davon ausgeht, dass man daraus einen Join bastelt...

          dafür muss man aber vor dem Gruppieren die Tabelle mit den Beiträgen sortieren, damit man immer den aktuellsten kriegt.

          SELECT * FROM threads thr INNER JOIN posts p ON thr.id = p.thread_id GROUP BY thr.id

          wäre der JOIN, und jetzt bring mal die Sortierung rein, damit der letzte Beitrag im GROUP BY erscheint... bei anderen DBMS geht das nicht mal, weil man Spalten selecten will, die in der gruppierten Tabelle drin sind...


          Vernünftig(er) wäre

          SELECT *, (SELECT * FROM posts WHERE p.thread_id = thr.id ORDER BY datum DESC LIMIT 1) FROM threads thr ORDER BY thr.datum DESC
          oder
          SELECT * FROM threads thr INNER JOIN posts p ON p.id = (SELECT id FROM posts p2 WHERE p2.thread_id = p.id ORDER BY datum DESC LIMIT 1) ORDER BY thr.datum DESC

          aber Subselects sind ja nicht gut in MySQL ... es gibt auch noch irgendeine Lösung per LEFT JOIN - wie gesagt SuFu

          Irgendwo im MySQL-Manual oder so wurde ein ORDER BEFORE GROUP(oder so)-Befehl vorgeschlagen...damit würde dann irgendwas wie
          SELECT * FROM threads thr INNER JOIN posts p ON p.thread_id = thr.id ORDER BEFORE GROUP p.datum DESC GROUP BY thr.id ORDER BY thread.datum DESC
          gehen... aber das gibt's halt nicht

          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
          Wie man Fragen richtig stellt

          Kommentar

          Lädt...
          X