mysql查询:如何获得每天的是/否投票数

vik*_*tra 5 mysql

我必须创建一个mysql查询来获得超过特定日期的每一天的投票分配,类似这样......

    date          yes_votes    no_votes
------------------------------------------
    2010-01-07    21           22
    2010-01-07    2            0
Run Code Online (Sandbox Code Playgroud)

我的桌子就像这样..

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

我被困在这....

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

这给出了每天的总投票数,但不是我想要的分配数.

ype*_*eᵀᴹ 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)
Run Code Online (Sandbox Code Playgroud)

这是一个适用于MySQL的技巧,flag=1可以是True或者False.但True = 1False = 0MySQL中,所以你可以添加使用1和0 SUM()的功能.

其他解决方案,IF或者CASE更好的清晰度,或者如果您有可能想要将数据库移动到另一个RDBMS.

与该问题无关的评论:

  • 使用保留字date或者count命名字段或表是不好的习惯.
  • 当您实际存储时间戳时,使用"日期"也不好.名称应反映使用情况.
  • 对于表名,建议使用单数(post_vote)而不是复数 - 尽管许多使用复数,但最终会让人感到困惑.对于某些领域或计算字段来说,复数是有用的,比如你yes_votesno_votes我们计算的地方.


Den*_*rdy 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)
Run Code Online (Sandbox Code Playgroud)