![](/img/trans.png)
[英]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.