2009-06-01 6 views
6

Ich habe eine Kommentarantwort (nur bis zu einer Ebene) Funktionalität. Alle Kommentare können so viele wie Antworten enthalten, aber keine Antworten können ihre weiteren Antworten haben.Wie man Kommentar Antwort in MYSQL Abfrage machen?

So Struktur meiner Datenbanktabelle ist wie unten

Id ParentId Comment 
1  0   this is come sample comment text 
2  0   this is come sample comment text 
3  0   this is come sample comment text 
4  1   this is come sample comment text 
5  0   this is come sample comment text 
6  3   this is come sample comment text 
7  1   this is come sample comment text 

In der obigen Strukturen commentid, 1 (gibt es 2 Antworten) und 3 (1 Antwort) hat Antworten. Um also die Kommentare und ihre Antworten zu holen, ist eine einfache Methode, zuerst alle Kommentare mit ParentId als 0 abzurufen und dann durch Ausführen einer while-Schleife alle Antworten dieser bestimmten commentId abzurufen. Aber das scheint Hunderte von Abfragen auszuführen, wenn ich ungefähr 200 Kommentare zu einem bestimmten Datensatz haben werde.

Also möchte ich eine Abfrage machen, die Kommentare mit ihren Antworten der Reihe nach abrufen wird;

Id ParentId Comment 
1  0   this is come sample comment text 
4  1   this is come sample comment text 
7  1   this is come sample comment text 
2  0   this is come sample comment text 
3  0   this is come sample comment text 
6  3   this is come sample comment text  
5  0   this is come sample comment text 

Ich habe auch einen Kommentar Datumsspalte in meinem Kommentar Tisch, wenn jemand will, diese Abfrage mit Kommentaren verwenden.

Also endlich möchte ich alle Kommentare und ihre Antworten mit einer einzigen MySQL-Abfrage abrufen. Bitte sag mir, wie ich das machen kann?

Danke

Antwort

15

Sie können einen Ausdruck in ORDER BY verwenden. Versuchen Sie dies:

SELECT * 
FROM comments 
ORDER BY IF(ParentId = 0, Id, ParentId), Id 

Dies wird zunächst nach ID, wenn ParentId = 0, oder von ParentId andernfalls sortiert. Das zweite Sortierkriterium ist die ID, um sicherzustellen, dass die Antworten der Reihe nach zurückgegeben werden.

+0

Schön, ich habe mich gefragt, wie das geht.:) –

+0

Nett, wirklich FANTASTISCH, es ist perfekt für eine Ebene Antwort Situation. – Prashant

+0

@rodion können wir einige Änderungen in der Abfrage vornehmen, um sie unabhängig von der Ebene der Antworten zu sortieren. Das bedeutet, dass die Antwort auch ihre eigenen Antworten haben kann. Etwas, was Digg macht http://digg.com/health/Snake_Oil_Oprah? – Prashant

1

Ich empfehle dringend, dass Sie Ihr Datenbankschema restrukturieren. Das Hauptproblem ist, dass Sie versuchen, Kommentare und Antworten als dasselbe zu behandeln, und sie sind einfach nicht dasselbe. Dies zwingt Sie zu schwierigen Abfragen.

Stellen Sie sich vor, Sie hätten zwei Tabellen: [KOMMENTARE: (ID, Text)] und Antworten auf Kommentare in einer anderen Tabelle [REPLIES (ID, Kommentar, Text)]. Das Problem scheint viel, viel einfacher zu sein, wenn man auf diese Weise denkt.

+0

Es ist momentan nicht möglich, die gesamte Tabellenstruktur zu ändern, wir müssen mit der aktuellen Situation gehen. – Prashant

+0

Ich denke, mit Self Join können wir das tun, aber wie bekomme ich nicht genau? – Prashant

-2

Wenn Sie/jemand nach einer einfachen Lösung suchen, dann könnte es hilfreich sein.

Strukturänderung - Ich nehme an, Sie haben es geändert, indem Sie die Blog-ID hinzugefügt haben. Wenn es keine Blog-ID gibt, wie sagen Sie, welche Kommentare spezifisch für einen Blog sind?

Zuerst dies tut, wird es nichts zu Ihrer Datenbank schaden,

update `tblcomments` set ParentId=Id where ParentId=0; 

dann die Blog-Kommentare und Kommentar Antworten zu erhalten, um (Kommentar - Antwort 1, antwortet 2 ... unter dem Kommentar

)

verwenden, um die bleow Abfrage

SELECT * 
FROM tblcomments 
ORDER BY ParentId ASC; 

Cheers, -PM.

+0

Ich war mir nicht sicher, ob das funktionieren würde, also habe ich es versucht. Das funktioniert * nicht *. –

+0

Bitte tu das nicht ... Dies wird deine gesamte Hierarchie zerstören. Benutze stattdessen @rodions antwort! ORDER BY IF (ParentId = 0, Id, ParentId), Id – Scriptlabs

Verwandte Themen