我目前正在尝试检索最新帖子及其相关帖子(每个帖子的 x 号)。我手头有以下查询:
SELECT id, title, content
(SELECT GROUP_CONCAT(title) FROM posts -- Select title of related posts
WHERE id <> p.id AND id IN (
SELECT p_id FROM tagsmap -- Select reletad post ids from tagsmap
WHERE t_id IN (
SELECT t_id FROM tagsmap -- Select the tags of the current post
WHERE p_id = p.id)
) ORDER BY id DESC LIMIT 0, 3) as related
FROM posts as p ORDER BY id DESC LIMIT 5
我的数据库结构很简单:一个帖子表。一个标签表。还有一个标签映射表,我将帖子与标签相关联。
这个查询工作正常(虽然我不知道它的性能,因为我的表中没有很多行——也许解释可以帮助我,但现在情况并非如此)。
我真正需要的是检索相关帖子的 ID 及其标题。
所以我想做SELECT GROUP_CONCAT(title), GROUP_CONCAT(id)
,但我知道这会导致错误。那么在这种情况下,检索 id 和标题的最佳方法是什么?我不想重写整个子查询来检索 id。应该有另一种方式。
编辑
SELECT p1.id, p1.title, p1.content,
group_concat(DISTINCT p2.id) as 'P IDs',
group_concat(DISTINCT p2.title) as 'P titles'
FROM posts as p1
LEFT JOIN tagsmap as tm1 on tm1.p_id = p1.id
LEFT JOIN tagsmap as tm2 on tm2.t_id = tm1.t_id and tm1.p_id <> tm2.p_id
LEFT JOIN posts as p2 on p2.id = tm2.p_id
GROUP BY p1.id
ORDER BY p1.id desc limit 5;
最后,这是我使用的查询。我删除了 Where 子句,因为它是不必要的,LEFT JOIN
而是JOIN
因为它会忽略没有标签的帖子。最后添加DISTINCT
到 group_concat 因为它正在连接重复的行(例如,如果一个帖子有多个带有相关帖子的公共标签,则会导致重复的连接)。
上面的查询完美运行。谢谢大家。