加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

PostgreSQL:加入另一个表的计数

发布时间:2020-12-13 18:07:23 所属栏目:百科 来源:网络整理
导读:我有三个表:用户,项目和板. create table users ( id serial primary key,name text); create table items ( id serial primary key,user_id int,title text); create table boards ( id serial primary key,title text);n 我想选择每个用户拥有的项目数和
我有三个表:用户,项目和板.
create table users (
    id serial primary key,name text
);  

create table items (
    id serial primary key,user_id int,title text
);  

create table boards (
    id serial primary key,title text
);n

我想选择每个用户拥有的项目数和板数的所有用户:

select
    users.*,count(items) as item_count,count(boards) as board_count
from users
    left join items on items.user_id = users.id
    left join boards on boards.user_id = users.id
group by users.id;

不幸的是,这并没有给我正确的数量.计数高于应有的数量.发生了什么,为什么,以及如何解决这个问题?

问题是由两个左连接产生重复值的事实引起的.

要解决此问题,您可以只计算不同的值

SELECT u.id,u.name,COUNT(DISTINCT i.id) item_count,COUNT(DISTINCT b.id) board_count
  FROM users u LEFT JOIN items i
    ON u.id = i.user_id LEFT JOIN boards b
    ON u.id = b.user_id
 GROUP BY u.id,u.name

或者分别计算每个用户的项目和板子,然后与用户一起加入

SELECT u.*,COALESCE(i.item_count,0) item_count,COALESCE(b.board_count,0) board_count
  FROM users u LEFT JOIN
(
  SELECT user_id,COUNT(*) item_count
    FROM items
   GROUP BY user_id
) i ON u.id = i.user_id LEFT JOIN
(
  SELECT user_id,COUNT(*) board_count
    FROM boards
   GROUP BY user_id
) b ON u.id = b.user_id

这是SQLFiddle演示

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读