2

例如,我有一个带有标签的简单博客。我有一个 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'

这个查询将为每个标签提供一行,每个标签都有相同的博客帖子数据,帖子 ID 为 101,添加 aGROUP 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 处理多个匹配行,或者只为获取每个帖子的标签而进行子查询?(实际的数据库当然比这更大更复杂,我想在连接中做尽可能多的事情。)

4

1 回答 1

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.nameTag.idsTag.names

但同样,在应用程序代码中迭代列(或在这种情况下为逗号分隔的值)而不是行真的更容易吗?

于 2013-07-30T22:45:09.187 回答