2011-06-02 37 views
5

沒有得票數我要創建一個MySQL查詢來獲取每一天超過一個特定的日期,像這樣的投票分佈...MySQL查詢:如何獲得肯定的數/每

date   yes_votes no_votes 
------------------------------------------ 
    2010-01-07 21   22 
    2010-01-07 2   0 

我的表是這樣的..

post_votes 
-------------------------- 
    id(longint) 
    date(timestamp) 
    flag(tinyint) // this stores the yes/no votes 1-yes, 2-no 

我停留在這個....

SELECT COUNT(*) AS count, DATE(date) FROM post_votes WHERE date > '2010-07-01' GROUP BY DATE(date) 

這給每票總數一天,但不是我想要的發行版。

+0

你能說得更清楚嗎?我懷疑我理解你的問題。 – 2011-06-02 07:24:55

+0

你想要的結果表中的第二行應該是'2010-02-07,2,0',對不對? – 2011-06-02 07:28:16

+0

@ypercude - 是啊!那愚蠢的複製粘貼:) – vikmalhotra 2011-06-02 07:31:19

回答

10
SELECT COUNT(*) AS count 
    , DATE(date) 
    , SUM(flag = 1) AS yes_votes 
    , SUM(flag = 2) AS no_votes 
FROM post_votes 
WHERE date > '2010-07-01' 
GROUP BY DATE(date) 

這是在MySQL中,它作爲flag=1要麼是TrueFalse一招。但是在MySQL中可以使用True = 1False = 0,因此您可以使用SUM()函數添加1和0。

其他解決方案與IFCASE會更好的清晰度,或者如果有任何機會你想要將數據庫移動到另一個RDBMS。

評論不相關的問題:

  • 這是不好的習慣使用像datecount保留字命名字段或表。
  • 實際存儲時間戳時,使用「日期」也不太好。名稱應該反映使用。
  • 對於表名,建議使用單數(post_vote),而不是複數 - 儘管許多複數使用複數,但最終會引起混淆。複數適用於某些領域或計算場地,例如您的yes_votesno_votes,我們有一個計數。
+0

+1感謝您的額外提示。 – vikmalhotra 2011-06-02 07:36:45

4

你幾乎在解:)

我會建議使用的IF條件的SUM方法,像這樣:

SELECT SUM(IF(flag = 'yes',1,0)) AS yes_count, 
     SUM(IF(flag = 'no',1,0)) AS no_count, 
     DATE(date) 
FROM post_votes 
WHERE date > '2010-07-01' 
GROUP BY DATE(date) 

這將使加1的功能僅當該值等於時,纔算每筆總和yes/no

+0

+1哦對。那完美的作品。謝謝。 – vikmalhotra 2011-06-02 07:26:40

4
SELECT DATE(date) as dt, 
sum(if(flag=1,1,0)) as yes, 
sum(if(flag=2,1,0)) as no 
FROM post_votes WHERE date > '2010-07-01' 
GROUP BY dt 
5

總結一下吧:

select date(date) as date, 
     sum(case when flag = 1 then 1 else 0) as yes, 
     sum(case when flag = 2 then 1 else 0) as no 
from post_votes 
where date > '2010-07-01' 
group by date(date) 
0

我也有這個問題。我能想到的最好的解決辦法,是在兩個領域分割的「標誌」,如:

upvote(tinyint) 
downvote(tinyint) 

然後你能指望他們很容易和沒有的mysql-巫術:

SELECT 
    SUM(upvote) AS up, 
    SUM(downvote) AS down, 
    DATE(`date`) AS Created_at 
FROM post_votes 
WHERE Created_at > '2010-07-01' 
GROUP BY Created_at 

Btw .:您不應該命名列date,因爲它是一個MySQL關鍵字。