将所有查询结果分组到一行中

时间:2013-07-30 22:18:21

标签: mysql join group-by

比如说,我有一个带标签的简单博客。我有一个Blog表,一个Tag表和一个TagRelation表。我想运行单个查询并获取每个博客帖子的所有相关数据,包括标签。

SELECT Tag.id AS 'Tag.id', Tag.name AS 'Tag.name', Blog.id AS 'Blog.id', Blog.author AS 'Blog.author', Blog.title AS 'Blog.title', Blog.content AS 'Blog.content' 
FROM Blog 
INNER JOIN TagRelation ON TagRelation.target = Blog.id
INNER JOIN Tag ON Tag.id = TagRelation.Tag
WHERE Blog.id = '101'

此查询会为每个标记提供一行,每个标记都有相同的博客后期数据101的博客数据,添加GROUP BY Blog.id只会给我一行,但无论是任意的第一个标记结果。

我想要的是这样的:

Blog.id | Blog.author | Blog.title | Blog.content | Tag.id | Tag.name | Tag.id | Tag.name 
-----------------------------------------------------------------------------------------
101     | someone     | something  | lolstuff     | 1      | tag1     | 2      | tag2

这样我的客户端代码就可以轻松地将其解析为对象。这是否可以在MySQL中处理同一个博客ID的多个匹配行或仅为每个帖子获取标签的子查询? (实际的数据库当然比这更大,更复杂,我想尽可能多地加入。)

1 个答案:

答案 0 :(得分:1)

涉及使用GROUP_CONCAT()

的临近解决方案
SELECT
    GROUP_CONCAT(Tag.id SEPARATOR ',') AS 'Tag.ids',
    GROUP_CONCAT(Tag.name SEPARATOR ',') AS 'Tag.names',
    Blog.id, Blog.author, Blog.title, Blog.content
FROM Blog 
INNER JOIN TagRelation ON TagRelation.target = Blog.id
INNER JOIN Tag ON Tag.id = TagRelation.Tag
WHERE Blog.id = '101'
GROUP BY Blog.id

这导致分别在Tag.idTag.name列中的相应Tag.idsTag.names的两个以逗号分隔的列表

但同样,在应用程序代码中迭代列(或本例中的逗号分隔值)会更容易吗?