首页 > 解决方案 > 如何从您的子查询表中打印两个属性值

问题描述

假设我有两张桌子,

  1. 用户
  2. 邮政

帖子由用户发布(即帖子表将具有user 的外键

现在我的问题是,

打印所有帖子超过 10 个的用户的详细信息

为了解决这个问题,我可以输入以下查询,它会给我想要的结果,

SELECT * from USER where user_id in (SELECT user_id from POST group by user_id having count(user_id) > 10)

当我还想打印帖子计数以及用户详细信息时,就会出现问题。现在无法从 USER 表中获取用户计数。这只能从 POST 表中完成。但是,我无法从我的子查询中获取两个值,即我无法执行以下操作,

SELECT * from USER where user_id in (SELECT user_id, **count(user_id)** from POST group by user_id having count(user_id) > 10)

那么,我该如何解决这个问题呢?我知道的一个解决方案是这样,但是我认为这将是解决这个问题的一种非常天真的方法,并且会使查询更加复杂,也更加缓慢,

SELECT u.*, (SELECT po.count(user_id) from POST as po group by user_id having po.count(user_id) > 10) from USER u where u.user_id in (SELECT p.user_id from POST p group by user_id having p.count(user_id) > 10)

有没有其他方法可以使用子查询来解决这个问题?

标签: sqljoinsubqueryrelational-databaseaggregate-functions

解决方案


将聚合移动到from子句:

SELECT u.*, p.num_posts
FROM user u JOIN
     (SELECT p.user_id, COUNT(*) as num_posts
      FROM post p
      GROUP BY p.user_id
      HAVING COUNT(*) > 10
     ) p
     ON u.user_id = p.user_id;

您可以使用子查询执行此操作:

select u.*
from (select u.*,
             (select count(*) from post p where p.user_id = u.user_id) as num_posts
      from users u
     ) u
where num_posts > 10;

使用索引post(user_id),这实际上可能比使用JOIN/的版本具有更好的性能GROUP BY


推荐阅读