2012-08-04 136 views
7

我有一个注释表和一个标记表。对于每条评论,可能有多个标签,或者没有。我想加入这两个,所以我可以得到每个评论的标签列表。MySQL一对多加入Group By只返回一个观察值

CommentTable:

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

TagTable:

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

因此,查询应返回代码,(5,6),用于一个commentID == 1和空数组为CommentID == 2

这是我 - 只选择最后一个ID,而不是倍数:

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

当你犯了一个_GROUP BY_,它必须包含至少你选择的所有数据。 – 2012-08-04 10:05:27

回答

21

您可以使用GROUP_CONCAT将多行中的数据转换为单个分隔字符串:

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 

在这种情况下,如果评论没有相应的标记,那么该字段将仅为NULL。


SQLFiddle Demo

+2

真棒......我很欣赏这种努力。我第一次看到SQLFiddle。 – Justin 2012-08-04 10:55:22

1

试试这个:

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

EDIT1:如果你想返回每组只有一行按照注释

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返回另一行以给出(1)的CommentID的完整TagID(5,6),但是对于上面给出的示例,在两种情况下CommentID字段均为空白。 – Justin 2012-08-04 10:06:10

+0

@Justin:plz现在检查 – 2012-08-04 10:09:23

+0

是的,但有没有一种方法可以只返回一行CommentID == 1而不是两个?目前,两行将分别返回TagID分别为5和6。 – Justin 2012-08-04 10:20:27

-1

你不要为这种情况需要组:

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