我有 3 个表,分别名为 houses
、trees
、rivers
。所有这些表都有 city_id
列。我想按城市对总数进行分组。城市在另一个表中。
我的数据库是postgresql。
city_name trees houses rivers
City-1 1000 200 1
City-2 300 100 2
City-3 4000 210 4
我可以去找树
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 查询中连接三个表。
最佳答案
为了避免 JOIN
中的行重复问题,最简单的方法可能是在子查询中进行聚合,然后 JOIN
它们:
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
。
关于sql - 如何连接多个表进行计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60666480/