[英]MySQL query result does not return some rows that should be in the result
[英]mysql query result is not displaying some rows
我对如何查询下表感到困惑。 我只想显示在特定日期订购和接收的数量。
日历表
id | date
1 | 2013-07-01
2 | 2013-07-02
3 | 2013-07-03
4 | 2013-07-04
5 | 2013-07-05
6 | 2013-07-06
7 | 2013-07-07
phone_details表
id | dateOrdered | dateReceived | upg
1 | 2013-07-01 | 2013-07-05 | exp
2 | 2013-07-02 | 2013-07-05 | post
3 | 2013-07-02 | 2013-07-06 | upgrade
4 | 2013-07-07 | 2013-07-07 | upggrade
5 | 2013-07-03 | 2013-07-04 | exp
6 | 2013-07-01 | 2013-07-02 | exp
我想要的结果是什么。
calendar.date | noOrdered | noReceived | # of post | # of exp | # of upgrade
2013-07-01 | 2 | | | 2 |
2013-07-02 | 2 | 1 | 1 | | 1
2013-07-03 | 1 | | | 1 |
2013-07-04 | | 1 | | |
2013-07-05 | | 2 | | |
2013-07-06 | | 1 | | |
2013-07-07 | 1 | 1 | | 1 |
这是我的查询:
select calendar.date,DAYNAME(calendar.date) as `day`,
sum(if((`phone_details`.`upg` = 'Post'),1,0)) AS `Post Paid`,
sum(if((`phone_details`.`upg` = 'Upgrade'),1,0)) AS `Upgrade`,
sum(if(((`phone_details`.`upg` = 'Exp') or (`phone_details`.`upg` = 'Future Exp')),1,0)) AS `Exp`,
(select count(phone_ID) FROM phone_details
WHERE dateReceived = calendar.date
)AS `received`
from `phone_details` JOIN calendar
where calendar.date = phone_details.dateOrdered
group by calendar.date DESC
此查询的问题是,如果日期没有订购,它不会在结果上显示,所以即使在该日期有接收,它仍然不会显示。 我的结果看起来像下面的表而不是上面的表。 如果我子查询每一列,我能够产生我想要的结果,但处理时间似乎显着减慢。
calendar.date | noOrdered | noReceived | # of post | # of exp | # of upgrade
2013-07-01 | 2 | | | 2 |
2013-07-02 | 2 | 1 | 1 | | 1
2013-07-03 | 1 | | | 1 |
2013-07-07 | 1 | 1 | | 1 |
一些指导意见将不胜感激。 非常感谢。
您将需要LEFT JOIN
为calendar
每一行生成结果,即使它们与phone_details
表中的任何内容都不匹配;
SELECT c.date "calendar_date",
SUM(c.date=pd.dateOrdered) noOrdered,
SUM(c.date=pd.dateReceived) noReceived,
SUM(c.date=pd.dateOrdered AND upg='post') "# of post",
SUM(c.date=pd.dateOrdered AND upg='exp') "# of exp",
SUM(c.date=pd.dateOrdered AND upg='upgrade') "# of upgrade"
FROM calendar c
LEFT JOIN phone_details pd
ON c.date = pd.dateOrdered
OR c.date = pd.dateReceived
GROUP BY c.date;
我不认为你的加入是正确的,因为你应该使用on而不是where:
from `phone_details` JOIN calendar
where calendar.date = phone_details.dateOrdered
尝试使用:
from `phone_details` JOIN calendar
on calendar.date = phone_details.dateOrdered
select calendar.date,DAYNAME(calendar.date) as `day`,
sum(if((`phone_details`.`upg` = 'Post'),1,0)) AS `Post Paid`,
sum(if((`phone_details`.`upg` = 'Upgrade'),1,0)) AS `Upgrade`,
sum(if(((`phone_details`.`upg` = 'Exp') or (`phone_details`.`upg` = 'Future Exp')),1,0)) AS `Exp`,
(select count(id) FROM phone_details
WHERE dateReceived = calendar.date
)AS `received`
from `phone_details` JOIN calendar
ON calendar.date = phone_details.dateOrdered or calendar.date = phone_details.dateReceived
group by calendar.date DESC
这很好用。 你可以在这里查看http://sqlfiddle.com/#!2/2b9ca/3
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.