我必须显示每天(从第一次投票到最后一次投票)用户投票给投票2的票数。
我当前的查询工作得很好;但是当某一天没有任何投票时,我就有麻烦了。例如,对于poll 2,这应该是结果:
2017年5月11日=1
2017年5月12日=0
2017年5月13日=0
2017年5月14日=0
2017年5月15日=0
2017年5月16日=0
2017年5月17日=1
2017年5月18日=0
2017年5月19日=0
2017年5月20日=2
……但是我得到的是:
2017年5月11日=1
2017年5月17日=1
2017年5月20日=2
所以,我需要的是,所有没有记录的日子(在第一次投票和最后一次投票之间)也会出现在选举结果中。这是我当前的查询:
SELECT DATE(poll_vote.date_insert) AS date_insert,
COUNT(poll_vote.id_vote) AS q
FROM poll_vote WHERE poll_vote.id_poll = 2
GROUP BY DATE(date_insert) ORDER BY date_insert
下面是SQL Fiddle和示例数据。谢谢!
最佳答案
正如@Strawberry所建议的,我最终用php而不是mysql编写了一个解决方案。对任何感兴趣的人来说,这是密码。
此解决方案只在空白日期之间的1天内返回0,因为这是我所需要的。例子:
2017年5月11日=1
2017年5月16日=0
2017年5月17日=1
2017年5月19日=0
2017年5月20日=2
这样我就可以像这样显示趋势线图:
$sql = 'SELECT DATE(poll_vote.date_insert) AS date_insert, COUNT(poll_vote.id_vote) AS q FROM poll_vote WHERE poll_vote.id_poll = :id_poll GROUP BY DATE(date_insert) ORDER BY date_insert';
$stmt = cnn()->prepare($sql);
if($id_poll) $stmt->bindValue(':id_poll', $id_poll, PDO::PARAM_INT);
$stmt->execute();
$data = $stmt->fetchAll();
# insert blank dates between existing dates
$hotness = array();
foreach($data as $item) {
if(!$temp) {
$temp = $item['date_insert'];
} else {
$date_past = new DateTime($temp);
$date_now = new DateTime($item['date_insert']);
$diff = $date_now->diff($date_past)->format("%a");
if($diff > 1) {
$date_new = new DateTime($item['date_insert']);
$date_new->modify('-1 day');
$hotness[] = array(
'date_insert' => $date_new->format('Y-m-d'),
'q' => 0
);
}
}
$hotness[] = array(
'date_insert' => $item['date_insert'],
'q' => $item['q']
);
}
# final result
print_r($hotness);