多个where子句和消除

时间:2017-11-17 20:58:10

标签: mysql sql

我正在尝试生成已经完成旅行并且从不在客户端取消的独特司机的数量。如果驱动程序曾在任何客户端取消,则应将其从结果中删除。

我想知道这里是否需要子查询。 我正在使用的数据显示在这里,虽然不成熟,但它只是测试我的查询。

id  driver_id   client_id   city_id status
1   1011        9004        546     completed
1   1011        9008        323     completed
2   1011        9001        546     completed
3   1011        9006        323     completed
3   1011        9007        154     cancelled_by_client
1   1012        9001        546     cancelled_by_client
2   1012        9003        123     cancelled_by_driver
2   1012        9002        789     completed
2   1013        9007        546     cancelled_by_driver
4   1013        9006        546     cancelled_by_driver
2   1015        9001        546     completed
3   1015        9006        323     completed
3   1015        9007        154     cancelled_by_client

我所追求的是因为我的预期结果是已完成旅行并且从未在客户端上取消的唯一驱动程序ID的计数(canceled_by_driver)。

driver_id    non_driver_cancels
1011         1
1015         1

我在这里有一个GROUP BY来显示更详细的数据,我看到驱动程序1012有一个cancel_by_driver,但它们仍在我的结果中。从那里我相信我可以简单地计算driver_id并完成这项任务。

非常感谢任何帮助。

http://sqlfiddle.com/#!9/ad7cca/7

2 个答案:

答案 0 :(得分:2)

您可以使用group byhaving

执行此操作
select driver_id, sum(status = 'cancelled_by_client') as client_cancels
from t
group by driver_id
having sum(status = 'cancelled_by_driver') = 0;

这假设唯一的其他类型的取消是“cancelled_by_client”,如您的数据所示。

答案 1 :(得分:0)

试试这个:

SELECT driver_id, COUNT( DISTINCT driver_id) as Non_Driver_Cancel
FROM Trip
WHERE status NOT IN (SELECT DISTINCT status FROM Trip WHERE status <> 'cancelled_by_driver')
GROUP BY driver_id;