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

标签 sql postgresql

我有 3 个表,分别名为 housestreesrivers。所有这些表都有 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

Demo on dbfiddle

关于sql - 如何连接多个表进行计数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60666480/

相关文章:

php - 我怎样才能加入 CakePHP 中的最后一个条目?

sql - 在 mySQL 中是否有带有 IF/ELSE 语句的 SELECT 之类的东西?

sql - 从 current_date 获取星期并在 SQL 中创建一个具有动态名称的表

database - 如果您忘记了密码,是否有办法侵入 PostgreSQL 数据库?

ruby-on-rails - 连接表有两个复数词。如何正确命名模型和迁移;为了销毁连接表上的孤儿。事件记录

sql - 如何将 PostgreSQL 格式转换为 GeoJSON 格式?

mysql - SQL 中的连接顺序是否重要(特定于 MySQL)- FROM 子句中的 NOT 表

php - 如何获得Laravel中所有型号的列表?

macos - 通过 docker-machine 运行带有数据卷的 postgres 容器

sql - UTC时间对应的本地时间