首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何连接多个表进行计数?

如何连接多个表进行计数?
EN

Stack Overflow用户
提问于 2020-03-13 15:31:11
回答 2查看 44关注 0票数 1

我有三个表,名为housestreesrivers。所有这些表都有city_id列。我想按城市对总数进行分组。城市在另一个表中。我的数据库是postgresql。

代码语言:javascript
复制
city_name    trees    houses      rivers
City-1       1000     200         1
City-2       300      100         2
City-3       4000     210         4

我可以拿到树

代码语言:javascript
复制
SELECT 
    city.name as city_name, 
    count(*) as trees
FROM trees as t, cities as city
WHERE t.city_id = city.city_id
GROUP BY city.name

但是我不能在sama查询中连接三个表。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-03-13 15:43:08

为了避免在JOIN中重复行的问题,最简单的方法可能是在子查询中进行聚合,然后对它们进行JOIN

代码语言:javascript
复制
SELECT c.name, 
       COALESCE(t.cnt, 0) AS trees,
       COALESCE(h.cnt, 0) AS houses,
       COALESCE(r.cnt, 0) AS rivers
FROM cities c
LEFT JOIN (SELECT city_id, COUNT(*) AS cnt
           FROM trees
           GROUP BY city_id) t ON t.city_id = c.city_id
LEFT JOIN (SELECT city_id, COUNT(*) AS cnt
           FROM houses
           GROUP BY city_id) h ON h.city_id = c.city_id
LEFT JOIN (SELECT city_id, COUNT(*) AS cnt
           FROM rivers
           GROUP BY city_id) r ON r.city_id = c.city_id

如果给定的城市没有树木、房屋或河流,我们就使用LEFT JOIN

Demo on dbfiddle

票数 2
EN

Stack Overflow用户

发布于 2020-03-13 16:02:02

尼克答案的另一种选择:

代码语言:javascript
复制
SELECT 
    city.name as city_name, 
    count(distinct t.id) as trees,
    count(distinct h.id) as houses,
    count(distinct r.id) as rivers
FROM  cities as city
left join trees as t on t.city_id = city.city_id
left join rivers as r on r.city_id = city.city_id
left join houses as h on h.city_id = city.city_id
GROUP BY city.name

--

不确定Postgres的具体性能影响,但这里有一篇文章(相当古老,所以事情可能已经发生了变化)表明Postgres中的count(distinct)可能会很慢,以及一些选项:

postgresql COUNT(DISTINCT ...) very slow

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60666480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档