我有一个正在尝试运行的 SQL 语句,但它抛出了一个错误:
SELECT fp.forum_id, COUNT(fp.forum_id) AS num_posts
FROM forums_posts fp
GROUP BY fp.forum_id
WHERE (
SELECT COUNT(p.post_id) AS num_joined_posts
FROM posts p
WHERE p.post_type IN ('TypeA', 'TypeB', 'TypeC')
AND p.forum_id = fp.forum_id
) > 0
ORDER BY num_posts DESC
forums_posts
表是一个将论坛 ID 与帖子 ID 匹配的关系表,而 posts
表(也存储帖子的论坛 ID)仅包含有关每个帖子的信息.我试图找出:哪些论坛有 TypeA、TypeB 或 TypeC 类型的帖子;以及每个论坛中有多少帖子。
嵌套 SQL 语句从来都不是我的强项。有人可以指出执行此操作的正确方法吗?谢谢。
最佳答案
where
应该在group by
之前。
你也可以使用显式的join
来写:
SELECT fp.forum_id, COUNT(fp.forum_id) AS num_posts
FROM forums_posts fp join
(SELECT p.forum_id, COUNT(p.post_id) AS num_joined_posts
FROM posts p
WHERE p.post_type IN ('TypeA', 'TypeB', 'TypeC')
group by p.forum_id
) p
on p.forum_id = fp.forum_id
GROUP BY fp.forum_id
ORDER BY num_posts DESC
不过,我认为最有效的翻译可能是:
SELECT fp.forum_id, COUNT(fp.forum_id) AS num_posts
FROM forums_posts fp join
GROUP BY fp.forum_id
having exists (select 1
FROM posts p
WHERE p.post_type IN ('TypeA', 'TypeB', 'TypeC') and
p.forum_id = pf.forum_id
limit 1
)
ORDER BY num_posts DESC
特别是如果你有一个关于帖子的索引(forum_id,post_type)。我将条件从 where
子句移至 having
子句,因为在分组后进行比较的数据可能较少。
关于mysql - 嵌套 SQL,查找哪些论坛有特定类型的帖子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14217949/