按天分组记录,包括MySQL之间不包含记录的天数

时间:2017-06-04 01:28:19

标签: mysql date

我必须显示每天(从第一次投票到最后一次投票)用户投票赞成投票数 2 的投票数。

我当前的查询工作正常;但是当某一天没有任何投票权时,我遇到了麻烦。例如,对于民意调查 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。谢谢!

1 个答案:

答案 0 :(得分:0)

正如@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

这使我能够像这样显示一个趋势线图:enter image description here

$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);