2014-09-22 79 views
0
id | sent_time   | status | campaignId | 
---+-------------------+--------+------------+ 
1 |2013-12-26 00:00:00| sent |  12  | 
---+-------------------+--------+------------+  
2 |2013-12-26 00:00:00| sent |  12  | 
---+-------------------+--------+------------+  
3 |2013-12-26 00:00:00| sent |  11  | 
---+-------------------+--------+------------+  
4 |2018-10-21 00:00:00| draft |  13  | 
---+-------------------+--------+------------+  
5 |2018-10-21 00:00:00| draft |  14  | 
---+-------------------+--------+------------+  
6 |2018-10-21 00:00:00| draft |  14  | 
---+-------------------+--------+------------+ 

我想從SENT_TIME顯示日期之間的數據場範圍,總結了「發送」狀態誰得到相同的「CAMPAIGNID」 ,這是我的查詢:MySQL的 - 總和場按日期範圍和group by

SELECT DATE(sent_time) AS date_sent_time, SUM(status='sent') AS total_sent_status 
    FROM sms_table WHERE (DATE(sent_time) BETWEEN 2014-08-26 AND 2014-09-30) 
    AND campaignId = 12 GROUP BY DATE(sent_time) 

有人可以幫我嗎?

+0

你想獲得狀態等於「已發送」的行數還是缺少某些內容? – andy 2014-09-22 15:54:25

+0

@andy我想獲取狀態發送的行數,campaignId = 12以及group by sent_time,是否有可能先生? – junior 2014-09-22 15:57:00

回答

2

試試這個:

SELECT 
    DATE(sent_time) AS sent_date, 
    COUNT(id) AS total_sent_status 
FROM sms_table 
WHERE 
    status = 'sent' 
    AND campaignID = 12 
    AND sent_time BETWEEN '2014-08-26 00:00:00' AND '2014-09-30 23:59:59' 
GROUP BY sent_date 

的幾個注意事項:

  • 您可以將狀態過濾器移至WHERE子句以簡化事情。確保你在這一列上有索引
  • 你不應該在where子句中使用計算值進行比較,就像你在使用DATE(sent_time)一樣,因爲這樣可以防止使用索引。你可以簡單地使用00:00:0023:59:59來解決這個問題,或者更好的辦法是,如果你的sent_time字段真的具有00:00:00的所有時間分量,如示例數據所示,只需將其設置爲日期字段即可。
+0

不工作sir :( – junior 2014-09-22 16:09:23

+0

@junior不工作在什麼方面 – 2014-09-22 16:10:05

+0

我在我的表中有這樣的記錄:campaignId:12 sent_time:2014-09-22 16:56:01狀態:發送,但它沒有返回任何先生 – junior 2014-09-22 16:13:43

0

您可以將我的多列...

... GROUP BY DATE(sent_time), campaignId 

要在擊穿。

或者作爲一個完整的查詢......

SELECT DATE(sent_time) AS date_sent_time, campaignId, SUM(status='sent') AS total_sent_status 
FROM sms_table WHERE (DATE(sent_time) BETWEEN 2014-08-26 AND 2014-09-30) 
GROUP BY DATE(sent_time), campaignId 
0

該查詢會給你在狀態「已發送」爲12的CampaignID的記錄計數2014年8月26日和2014-09之間發生-30

SELECT 
    DATE(sent_time) AS date_sent_time, 
    COUNT(status) AS total_sent_status 
FROM sms_table 
WHERE 
    DATE(sent_time) BETWEEN '2014-08-26' AND '2014-09-30' AND 
    campaignId = 12 AND 
    status = 'Sent' 
GROUP BY sent_time 
1

您可以在status='sent'移動條件的WHERE子句,並添加COUNT(id)到SELECT如下:

SELECT DATE(sent_time) AS date_sent_time, COUNT(id) AS total_sent_status 
FROM sms_table 
WHERE sent_time BETWEEN '2014-08-26 00:00:00' AND '2014-09-30 23:59:59' 
AND campaignId = 12 
AND status = 'sent' 
GROUP BY date_sent_time 

您應該確實不使用的功能,因爲這在where子句中,可以防止MySQL的使用索引。另請注意,您可以在GROUP BY子句中使用別名。

這裏是一個sqlfiddle

+0

我有這個記錄在我的表中: campaignId:12 sent_time:2014-09 -22 16:56:01 status:發送 我嘗試了您的查詢,但仍然無法正常工作:( – junior 2014-09-22 16:08:02

+0

@junior我添加了一個示例並修復了查詢 – andy 2014-09-22 16:30:38

+0

哦,我的壞..我忘了把日期放在' '..對不起先生現在有用,謝謝你的幫助:) – junior 2014-09-22 16:32:32