2009-06-01 6 views
6

Sto avendo la funzionalità di risposta di commento (soltanto fino a un livello). Tutti i commenti possono avere più risposte, ma nessuna risposta può avere le loro ulteriori risposte.Come rendere la query di risposta ai commenti in MYSQL?

Quindi la mia struttura della tabella del database è come di seguito

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 

nelle strutture di cui sopra, commentid, 1 (ha 2 risposte) e 3 (1 risposta) ha risposte. Quindi, per recuperare i commenti e le loro risposte, un metodo semplice è prima di recuperare tutti i commenti che hanno ParentId come 0 e poi eseguendo un ciclo while recuperano tutte le risposte di quel particolare commentoId. Ma sembra che stiano correndo centinaia di domande se avrò circa 200 commenti su un particolare record.

Quindi voglio fare una query che recuperi i commenti con le loro risposte in sequenza come segue;

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 

Ho anche una colonna di data commento nel mio commento tavolo, se qualcuno vuole usare questo con commento query.

Quindi, alla fine, voglio recuperare tutti i commenti e le loro risposte utilizzando una sola query mysql. Per favore dimmi come posso farlo?

Grazie

risposta

15

È possibile utilizzare un'espressione in un ORDER BY. Prova questo:

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

Questo verrà prima ordinare per ID, se ParentId = 0 o per ParentId in caso contrario. Il secondo criterio di ordinamento è l'Id, per assicurare che le risposte vengano restituite in ordine.

+0

Bello, mi chiedevo come farlo.:) –

+0

Bello, davvero ECCEZIONALE, è perfetto per situazioni di risposta a un livello. – Prashant

+0

@rodion possiamo apportare alcune modifiche alla query per ordinarla indipendentemente dal livello delle risposte. Ciò significa che la risposta può anche avere le proprie risposte, Qualche cosa sta facendo digg http://digg.com/health/Snake_Oil_Oprah? – Prashant

1

Consiglio vivamente di ristrutturare lo schema del database. Il problema principale è che si sta tentando di trattare commenti e risposte come la stessa cosa, e che non sono la stessa cosa semplici. Questo ti costringe a fare alcune domande difficili.

Immaginate di avere due tabelle: [COMMENTI: (id, testo)], e risponde ai commenti in un'altra tabella [RISPOSTE (id, commentid, testo)]. Il problema sembra molto, molto più facile se si pensa in questo modo.

+0

Attualmente non è possibile modificare l'intera struttura della tabella, dobbiamo andare con la situazione attuale. – Prashant

+0

Penso che facendo uso dell'auto join possiamo farlo, ma come non sto ottenendo esattamente? – Prashant

-2

Se/qualcuno sta cercando una soluzione semplice, potrebbe essere utile.

Cambio struttura - Suppongo che tu l'abbia modificato aggiungendo un ID blog, se non esiste un ID blog, come puoi dire quali commenti sono specifici per un blog?

prima fare questo, non danneggerà nulla al database,

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

poi per ottenere i commenti del blog e commento risposte in ordine (il commento - risposta 1, risposta 2 ... sotto il commento)

utilizzare la query bleow

SELECT * 
FROM tblcomments 
ORDER BY ParentId ASC; 

Cheers, -PM.

+0

Non ero sicuro che questo avrebbe funzionato, quindi l'ho provato. Questo * non * funziona. –

+0

Per favore non farlo ... Questo distruggerà completamente la tua gerarchia. Utilizza invece la risposta @rodions! ORDER BY IF (ParentId = 0, Id, ParentId), Id – Scriptlabs