[英]mysql query: how to get the number of yes/no votes per day
我必須創建一個 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)
這給出了每天的總票數,但不是我想要的分布。
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
將是True
或False
。 但是 MySQL 中的True = 1
和False = 0
,因此您可以使用SUM()
function 添加 1 和 0。
使用IF
或CASE
的其他解決方案會更好,或者如果您有任何機會將數據庫移動到另一個 RDBMS。
與問題無關的評論:
date
或count
等保留字來命名字段或表是一個壞習慣。post_vote
) 而不是復數 - 盡管許多使用復數,但最終會讓人感到困惑。 復數適用於某些字段或計算字段,例如我們有計數的yes_votes
和no_votes
。總結一下:
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)
你幾乎是在解決方案:)
我建議在SUM
方法中使用IF
條件,如下所示:
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)
這將允許 function 僅在值等於是/ yes
時no
每個總和加 1
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
我也有這個問題。 我能想到的最佳解決方案是將“標志”拆分為兩個字段,例如:
upvote(tinyint)
downvote(tinyint)
然后你可以很容易地計算它們,而無需 mysql-voodoo:
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
順便說一句:您不應該命名列date
,因為它是 MySQL 關鍵字。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.