我有两个表,一个用于帖子,一个用于与帖子相关的标签,其中posts.tags保存与帖子相关的标签的I。
帖子:
id | title | tags
-----------------
1 | Foobar | 1 3 7
2 | Barfoo | 2 3 7标签:
id | tag
--------
1 | Tag1
2 | Tag2
... and so forth在查询帖子时,我希望得到一个帖子,它的所有标签都是空格分隔的字符串,而不是标签ids字符串。
我尝试了如下查询:
SELECT *,
(
SELECT GROUP_CONCAT(tags.tag)
FROM tags
WHERE tags.id LIKE 1 OR tags.id LIKE 3
) AS tag_str
FROM posts这基本上输出了我正在寻找的东西;我不能确定的是子句中正确的WHERE条件,用我自己的话说,它将检查“是否有标记,其中tag.id匹配posts.tags中任何以空格分隔的数字-字符串”-如果任何这样的查询是可能的?
感谢你的帮助,k。
发布于 2011-12-05 22:47:20
你的基本数据库设计是有缺陷的,现在你正在承受这个缺陷的后果。如果您有任何可能解决此问题,您应该这样做。标签不应该作为空格分隔的字符串存储在Posts表的单个列中。相反,您应该有一个连接表Posts_Tags_xref,它可以解决多对多关系。该表由两个外键Posts.id和Tags.id组成。

对于上面的示例数据,您需要:
Posts_Tags_xref
==================
post_id tag_id
------- ------
1 1
1 3
1 7
2 2
2 3
2 7然后您请求的查询将变为:
SELECT p.post_id, p.title, GROUP_CONCAT(t.tag)
FROM Posts p
LEFT JOIN Posts_Tags_xref ptx
INNER JOIN Tags t
ON ptx.tag_id = t.tag_id
ON p.post_id = ptx.post_id
GROUP BY p.post_id, p.title;https://stackoverflow.com/questions/8387006
复制相似问题