2012-08-04 9 views
7

Tengo una tabla de comentarios y una tabla de etiquetas. Para cada comentario, podría haber múltiples etiquetas, o ninguna. Quiero unirme a los dos para poder obtener una lista de etiquetas para cada comentario.MySQL de uno a muchos se unen con Group By solo devuelve una observación

CommentTable:

+---------+----------+---+ 
|CommentID| Title | ..| 
+---------+----------+---+ 
| 1  | animals| | 
| 2  | plants | | 
+---------+----------+---+ 

TagTable:

+---------+----------+---+ 
| TagID |CommentID | ..| 
+---------+----------+---+ 
| 5 |  1 | | 
| 6 |  1 | | 
| 7 |  3 | | 
+---------+----------+---+ 

lo tanto, una consulta debe devolver las etiquetas, (5,6) para una commentID == 1 y matriz vacía para CommentID == 2

Esto es lo que tengo - que sólo se selecciona el último ID y no múltiplos:

SELECT c.CommentID, c.Title, t.TagID FROM Comment as c 
     LEFT OUTER JOIN Tag as t ON c.CommentID = t.CommentID 
     GROUP BY t.TagID 
+0

Cuando se hace una _GROUP BY_, debe contener todos los datos mínimos que ha seleccionado. –

Respuesta

21

Puede usar GROUP_CONCAT para convertir datos en varias filas en una sola cadena delimitada:

SELECT a.CommentID, 
      a.Title, 
      GROUP_CONCAT(b.TagID ORDER BY b.TagID) AS tags 
FROM  CommentTable a 
LEFT JOIN TagTable b ON a.CommentID = b.CommentID 
GROUP BY a.CommentID, 
      a.Title 

En este caso, si un comentario no tiene una etiqueta correspondiente, el campo sería NULO.


SQLFiddle Demo

+2

Awesome ... Aprecio el esfuerzo. Primera vez que he visto SQLFiddle. – Justin

1

probar esto:

SELECT c.CommentID, c.Title, t.TagID FROM Comment as c 
     LEFT OUTER JOIN Tag as t ON c.CommentID = t.CommentID 

edit1: Si desea devolver sólo una fila por cada grupo de acuerdo con el comentario

SELECT c.CommentID, c.Title,MAX(t.TagID) 
FROM Comment as c 
left OUTER JOIN TagTable as t ON c.CommentID = t.CommentID 
GROUP BY c.CommentID, c.Title 
+0

MYSQL devuelve otra fila para dar el TagID completo (5,6) para un CommentID de (1), sin embargo el campo CommentID está en blanco en ambos casos para el ejemplo anterior. – Justin

+0

@Justin: compruebe ahora –

+0

sí, pero ¿hay alguna manera de que pueda devolver solo una fila para un CommentID == 1 en lugar de dos? Actualmente, se devolverán dos filas con un TagID de 5 y 6 respectivamente. – Justin

-1

No es necesario por el grupo para esta situación:

SELECT c.CommentID, c.Title, t.TagID FROM Comment as c 
LEFT OUTER JOIN Tag as t ON c.CommentID = t.CommentID