sql - 如何将 SQL 查询分成 2 个子查询

标签 sql postgresql postgresql-9.4

我有一个包含这些表的数据库:

  1. 用户(ID、电子邮件)
  2. 行程(id、driver_id)
  3. MatchedTrips(id、trip_id)

我需要获取每个用户他创建的行程总数除以找到的匹配总数。

我一直在为此构建原始 SQL 查询。这是我尝试过的,并且肯定它远非正确。

SELECT
  users.email,
  total_trips.count1 / total_matches.count2
FROM users CROSS JOIN (SELECT
        users.email,
        count(trips.driver_id) AS count1
      FROM trips
        INNER JOIN users ON trips.driver_id = users.id
      GROUP BY users.email) total_trips
      CROSS JOIN (SELECT users.email, count(matches.trip_id) AS count2
                   FROM matches
                   LEFT JOIN trips ON matches.trip_id = trips.id
                   LEFT JOIN users ON trips.driver_id = users.id
                   GROUP BY users.email) total_matches;

最佳答案

您可以按如下方式计算每个司机的总行程和总匹配数:

select driver_id, count(t.id) as total_trips, count(m.id) as total_matches
from trips t
left join matches m on (t.id = trip_id)
group by 1

将此查询用作与users连接的派生表:

select email, total_trips, total_matches, total_trips::dec/ nullif(total_matches, 0) result
from users u
left join (
    select driver_id, count(t.id) as total_trips, count(m.id) as total_matches
    from trips t
    left join matches m on (t.id = trip_id)
    group by 1
    ) s on u.id = driver_id
order by 1;

SQLFiddle.

关于sql - 如何将 SQL 查询分成 2 个子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46663440/

相关文章:

php - Doctrine 找不到 PostgreSQL PDO 驱动程序?

sql - 如何查询关联不存在或全部具有非空值的记录?

ubuntu - 如何启动Kong?

sql - 使用来自 SQL Server 的参数运行 exe 文件

sql - 将所选列从 CSV 文件导入到 SQL Server 表

Django Postgresql ArrayField 聚合

postgresql - 如何知道 SP 的修改日期?

mysql - SQL如何构造一个表中的两列依赖于另一个表的查询?

MySQL 跳过 auto_increment 值

php - 为什么 PDO for Postgres 返回 bool 字段的整数