2009-06-01 48 views
6

Tengo una funcionalidad de respuesta de comentarios (solo hasta un nivel). Todos los comentarios pueden tener tantas como respuestas, pero ninguna respuesta puede tener sus respuestas adicionales.¿Cómo hacer una consulta de respuesta de comentario en MYSQL?

Así que mi estructura de la tabla de base de datos es, como a continuación

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 

En las estructuras anteriores, commentid, 1 (tiene 2 respuestas) y 3 (1 respuesta) tiene respuestas. Así que para buscar los comentarios y sus respuestas, un método simple es primero que obtengo todos los comentarios con ParentId como 0 y luego ejecutando un ciclo while obtengo todas las respuestas de ese particular ID de comentario. Pero parece que está ejecutando cientos de consultas si tengo alrededor de 200 comentarios en un registro en particular.

Así que quiero hacer una consulta que buscará Comentarios con sus respuestas secuencialmente de la siguiente manera;

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 

que también tienen una columna de fecha comentario en mi mesa de comentario, si alguien quiere utilizar este comentario con la consulta.

Así que, finalmente, quiero buscar todos los comentarios y sus respuestas mediante el uso de una única consulta de MySQL. Por favor dime como puedo hacer eso?

Gracias

Respuesta

15

Puede usar una expresión en un ORDER BY. Prueba esto:

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

Esto hará primero ordenar por Id, si parentid = 0, o por parentid lo contrario. El segundo criterio de clasificación es Id, para garantizar que las respuestas se devuelven en orden.

+0

Bien, me preguntaba cómo hacer eso.:) –

+0

Agradable, realmente IMPRESIONANTE, es perfecto para la situación de respuesta de un nivel. – Prashant

+0

@rodion podemos hacer algunos cambios en la consulta para pedirlo sin importar el nivel de las respuestas. Eso significa que la respuesta también puede tener sus propias respuestas. ¿Algo que digg está haciendo http://digg.com/health/Snake_Oil_Oprah? – Prashant

1

Recomiendo encarecidamente que restructure el esquema de su base de datos. El principal problema es que intenta tratar los comentarios y las respuestas como si fueran lo mismo, y lo simple no es lo mismo. Esto te obliga a hacer algunas preguntas difíciles.

Imagine que tiene dos tablas: [COMMENTS: (id, text)], y responde a los comentarios en otra tabla [RESPUESTAS (id, commentid, text)]. El problema parece mucho, mucho más fácil cuando se piensa de esta manera.

+0

No es posible cambiar toda la estructura de la mesa actualmente, tenemos que ir con la situación actual. – Prashant

+0

Creo que al hacer uso de la unión uno mismo podemos hacer esto, pero ¿cómo no estoy obteniendo exactamente? – Prashant

-2

Si usted/alguien está buscando una solución simple, entonces podría ser útil.

Cambio de estructura: supongo que lo ha cambiado al agregar la ID del blog. Si no hay una ID de blog, ¿cómo dice qué comentarios son específicos de un blog?

En primer lugar hacer esto, no dañará nada a su base de datos,

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

a continuación para obtener los comentarios del blog y respuestas de comentario en orden (comentario - 1 respuesta, responder 2 ... bajo el comentario)

utilizar la consulta bleow

SELECT * 
FROM tblcomments 
ORDER BY ParentId ASC; 

Cheers, -PM.

+0

No estaba seguro de si esto funcionaría, así que lo intenté. Esto no * funciona *. –

+0

Por favor, no hagas eso ... Esto destruirá tu hirarchy completamente. ¡Usa @rodions answer en su lugar! ORDER BY IF (ParentId = 0, Id, ParentId), Id – Scriptlabs

Cuestiones relacionadas