mysql - 嵌套 SQL,查找哪些论坛有特定类型的帖子

标签 mysql sql subquery

我有一个正在尝试运行的 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/

相关文章:

c# - 如何从 .net 中的网络服务器连接数据库?

mySQL DB 在站点处于事件状态时添加表

php - android - 如何将android中的多个数据json发送到mysql数据库?

java - : sequence id using JPA @TableGenerator, @GeneratedValue 与数据库 Auto_Increment 之间有什么区别

mysql - 在所有行的最后一个斜杠后添加特定单词

大型插入查询中的mysql子查询

mysql - GROUP BY 在 SUBQUERY WITH UNION ALL

MySQL 查询和子查询专家

java - 如何在mysql工作台中调用过程

php - Mysql 中的日期之间无法正常工作