簡體   English   中英

mysql查詢結果不顯示某些行

[英]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 JOINcalendar每一行生成結果,即使它們與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;

一個要測試的SQLfiddle

我不認為你的加入是正確的,因為你應該使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM