跳转至

2238. 司机成为乘客的次数 🔒

难度中等

题目描述

表: Rides

+--------------+------+
| Column Name  | Type |
+--------------+------+
| ride_id      | int  |
| driver_id    | int  |
| passenger_id | int  |
+--------------+------+
ride_id 是该表的主键(具有唯一值的列)。
该表的每一行都包含驾驶员的 ID 和在 ride_id 中乘车的乘客的 ID。
注意 driver_id != passenger_id。

 

编写解决方案,获取每个司机的 ID 和他们作为乘客的次数。

以 任意顺序 返回结果表。

结果格式如下所示。

 

示例 1:

输入: 
Rides 表:
+---------+-----------+--------------+
| ride_id | driver_id | passenger_id |
+---------+-----------+--------------+
| 1       | 7         | 1            |
| 2       | 7         | 2            |
| 3       | 11        | 1            |
| 4       | 11        | 7            |
| 5       | 11        | 7            |
| 6       | 11        | 3            |
+---------+-----------+--------------+
输出: 
+-----------+-----+
| driver_id | cnt |
+-----------+-----+
| 7         | 2   |
| 11        | 0   |
+-----------+-----+
解释: 
在所有给定的行程中有两名司机: 7 和 11.
ID = 7 的司机曾两次成为乘客。
ID = 11 的司机从来不是乘客。

解法

方法一

思考

对每位出现过的司机,统计他作为乘客出现的次数;从未当过乘客则为 \(0\)。直接在 \(\textit{Rides}\) 上按乘客分组会丢掉只当司机、从未坐车的人。

先取出所有不同的 \(\textit{driver\_id}\),再左连接 \(\textit{Rides}\),连接条件是「该司机等于某行的乘客」。分组计数 \(passenger\_id\) 即可,左连接保证零次乘客仍保留。

1
2
3
4
5
6
7
# Write your MySQL query statement below
WITH T AS (SELECT DISTINCT driver_id FROM Rides)
SELECT t.driver_id, COUNT(passenger_id) AS cnt
FROM
    T AS t
    LEFT JOIN Rides AS r ON t.driver_id = r.passenger_id
GROUP BY 1;

评论