比如说,我有一个带标签的简单博客。我有一个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的多个匹配行或仅为每个帖子获取标签的子查询? (实际的数据库当然比这更大,更复杂,我想尽可能多地加入。)
答案 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.id
和Tag.name
列中的相应Tag.ids
和Tag.names
的两个以逗号分隔的列表
但同样,在应用程序代码中迭代列(或本例中的逗号分隔值)会更容易吗?