2016-07-30 10 views
-1

Ich habe drei Tabellen, 1.comment, 2.nested Kommentar, 3. Benutzername ich zur Zeit zu kämpfen, wie die verschachtelten Kommentar zur Ausgabe der beste WegAusgabe geschachtelt Kommentar basiert auf drei Tabellen

$sql = "SELECT comment.*, nested_comment.subject AS nc_subject, users.username 
    FROM comment 
    INNER JOIN users 
     ON comment.user_id = users.id AND comment.blog_id = $id 
    LEFT JOIN nested_comment 
     ON comment.id = nested_comment.comment_id 
    ORDER BY comment.id DESC"; 

mein aktuelle Ansicht-Code

<? while($comment = $result->fetch_object()) { ?> 

<p> <?=$comment->subject . ' by ' . $comment->username; ?> </p> 

<hr> 
<div class="nested_comment"> 
    <p> <?=$comment->nc_subject; ?> </p> 
</div> 

alle Daten i gezeigt wollte, aber sagen, ich habe -2 verschachtelte comment- in -1 Eltern comment-, die Mutter Kommentar noch zeigt sich 2 mal nur einmal insted.

Ich kann mit der if-else-Anweisung auf der while-Schleife überprüfen, ob die vorherige Kommentar-ID die gleiche ist, aber ich suche eine elegantere/effizientere Lösung dafür, ich bin mir nicht sicher, wie man 'gruppiert 'it on sql

Antwort

1

Da Sie alle Spalten für Kommentare und verschachtelte Kommentare in derselben Abfrage abrufen, enthält jede Zeile des Ergebnisses Kommentare und so oft, wie es geschachtelte Kommentare gibt.

Entweder teilen Sie die Abfrage in 2 separate Abfragen, um Kommentare und verschachtelte Kommentare getrennt zu erhalten, oder, wie Sie sagten, setzen Sie eine if Klausel, um zu überprüfen, ob die aktuelle comment.id die gleiche ist wie die letzte.

Mit dem if, so etwas wie:

<? curr_id = -1; 
    while($comment = $result->fetch_object()) { 
     if $comment->id != curr_id { 
       curr_id = $comment->id ?> 
      <p> <?=$comment->subject . ' by ' . $comment->username; ?> </p> 
     <? } ?> 
     <hr> 
     <div class="nested_comment"> 
     <p> <?=$comment->nc_subject; ?> </p> 
     </div> 
+0

Dank für ur Antwort, hmm .. das ist nicht möglich, mit 1 Abfrage? vielleicht gibt es etwas wie Gruppierung alle mit der gleichen -comment Eltern-ID aus der SQL-Abfrage, vielleicht .. – Hilmanrdn

+0

Selbst wenn Sie nach gruppieren, erhalten Sie immer noch die _grouped_ Spalte in [jeder Zeile des Ergebnisses] (http: // www .w3schools.com/sql/trysql.asp? filename = trysql_select_groupby_2). Btw, fügen Sie in Ihrer 'ORDER BY'-Klausel' nested_comment.id' hinzu. – aneroid

+0

ich dont "meine" Gruppe von "auf die Abfrage, ich meine" Gruppierung "ich bin sicher, Sie wissen, was ich meine. Ja immer noch fraglich welcher Weg der Beste ist, danke trotzdem! – Hilmanrdn

2

Für eine elegante Art und Weise, können Sie diese Kommentare in ein Array holen von der Mutter Kommentare wie die Array-Tasten und verschachtelte Kommentare als Werte.

Dann können Sie über dieses Array mit "foreach" iterieren und Ihr div aufbauen.

$ key ist Ihr übergeordneter Kommentar und $ value wird ein Array sein, das Ihre verschachtelten Kommentare enthält. Sie müssen also auch über $ iterieren, um Ihre verschachtelten Kommentare zu erhalten.

Sie diese Antwort überprüfen kann für Schlüssel-Wert-Array Nutzung: https://stackoverflow.com/a/1951708/2698754

+1

Gute Option. Ich habe es tatsächlich schon einmal gemacht, aber sobald wir 10k Zeilen Ergebnis für jede Seite hatten, schien es eine schlechte Idee, all das im Array zu speichern, da es zuerst vor jeder Ausgabe erstellt werden musste. Beachten Sie, dass "Kommentar-> ID" ein besserer Schlüssel als "Kommentar-> Betreff" ist, da die Betreffzeilen in allen Vergleichskommentaren identisch sein können. – aneroid

+0

danke für die Lösung, interessantes Thema, das ist der beste Weg, um es bei höheren Volumen zu tun, ist in zwei Abfragen schneller? – Hilmanrdn

+0

@aneroid Ja, du hast Recht, ich habe den Punkt über Themen total verpasst. Ich dachte, es wäre eine gute Idee, sie als Schlüssel zu benutzen, da er sie ausdrucken wird. – tyb