sql查询没有返回我想要的东西

7kjnsjlb  于 2021-06-15  发布在  Mysql
关注(0)|答案(1)|浏览(285)

我不明白为什么我的查询没有返回我想要的东西。有人能帮我一下吗?
table:

查询(cte):

WITH cancel AS(
SELECT t.Request_at AS day, IFNULL(COUNT(t.Status),0) AS cancelled
FROM Trips t
LEFT JOIN Users u
ON t.Client_Id = u.Users_Id
WHERE (t.Status = "cancelled_by_driver" or t.Status = "cancelled_by_client")
AND t.Request_at BETWEEN "2013-10-01" AND "2013-10-03"
AND u.Banned = "No"
GROUP BY t.Request_at)

所以我想让上面的cte返回2013年10月1日至2013年10月3日期间未绑定用户或司机取消的行程数。我的查询返回的是被取消日期的正确数字,但没有返回没有取消日期的“0”。我不明白为什么结果是这样的,因为我已经在使用ifnull和left join了。

3yhwsihp

3yhwsihp1#

这个 where 子句在您有机会将没有取消驱动器的日期包括在结果集中之前逐出这些日期。
如果表中有所有可用的日期(无论状态如何),只需在聚合中移动条件即可:

select t.request_at, 
    sum(t.status in ('cancelled_by_driver', 'cancelled_by_client')) as cnt_cancelled
from trips t
inner join users u on u.user_id = t.client_id
where u.banned = 'No' and t.request_at between '2013-10-01' and '2013-10-03'
group by t.request_at

一种更通用的方法是使用日历表来处理日期,然后使用 left join . 如果没有这样的表,可以通过递归查询(mysql 8.0中提供)动态生成:

with recursive cal as (
    select '2013-10-01' as dt
    union all
    select dt + interval 1 day from cal where dt < '2013-10-03'
)
select c.dt, count(t.id) as cnt_cancelled
from cal c
left join trips t on t.request_at = c.dt and t.status in ('cancelled_by_driver', 'cancelled_by_client')
left join users u on u.user_id = t.client_id and u.banned = 'No'
group by c.dt

相关问题