gpt4 book ai didi

具有多列的 MySQL 嵌套选择

转载 作者:行者123 更新时间:2023-11-29 04:48:09 25 4
gpt4 key购买 nike

我目前正在尝试检索最新的帖子及其相关帖子(每个帖子 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,因为它连接了重复的行(例如,如果一个帖子有多个公共(public)标签和一个相关的帖子,它将导致重复连接)。

上面的查询非常有效。谢谢大家。

最佳答案

好的 - 这会起作用,并且它具有消除子查询的额外优势(当您获得大量记录时,这会减慢您的速度):

SELECT p1.id, p1.title, p1.content,
group_concat( p2.id) as 'P IDs',
group_concat( p2.title) as 'P titles'
FROM posts as p1
JOIN tagsmap as tm1 on tm1.p_id = p1.id
JOIN tagsmap as tm2 on tm2.t_id = tm1.t_id and tm1.p_id <> tm2.p_id
JOIN posts as p2 on p2.id = tm2.p_id
WHERE p2.id <> p1.id
GROUP BY p1.id
ORDER BY p1.id desc limit 5;

我们在这里所做的是从第一个版本的帖子中选择您想要的内容,通过它们的 post.id 将它们加入到 tagsmap,通过标签 id 进行自连接到 tagsmap 以获取所有相关标签,然后加入另一个帖子 (p2) 以获取那些相关标签指向的帖子。

使用 GROUP BY 丢弃所有加入的重复项,然后就完成了。

关于具有多列的 MySQL 嵌套选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15579549/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com