分组并显示日期和显示计数下的条目

时间:2011-02-28 15:54:08

标签: php mysql sql group-by

这是我的数据:

id date  
1 2009-01-01 10:15:23  
2 2009-01-01 13:21:29  
3 2009-01-02 01:03:13  
4 2009-01-03 12:20:19  
5 2009-01-03 13:01:06 

我想做的是按每个日期分组,然后列出每个日期下方的ID号。我还想列出每个日期的ID数。

所以我的输出看起来像:

2009-01-01  - Count:2
1  
2   
2009-01-02  - Count:1
3  
2009-01-03  - Count:2
4  
5  

我有以下代码可以使用,但需要帮助更改逻辑以显示计数。

$query = "SELECT DATE(date) as mydate, id FROM your_data_table ORDER BY mydate, id";
$result = $pdo->query($query);

$oldDate = false;
while ( list($date, $id) = $result->fetch(PDO::FETCH_NUM) ) {
    if ( $oldDate != $date ) {
        echo "$date\n$id\n";
        $oldDate = $date;
    } else {
        echo "$id\n";
    }
}

3 个答案:

答案 0 :(得分:1)

如果您不介意让DB完成所有工作,并且可能会解析结果,那么一个简单的方法是:

SELECT DATE(date) as mydate, COUNT(id) as num, GROUP_CONCAT(id SEPARATOR ",") as ids
FROM your_data_table
GROUP BY DATE(date)
ORDER BY mydate

可能需要一些工作(没有测试过)。

答案 1 :(得分:0)

对于由MySQL自动完成的组总计,您需要使用ROLLUP选项。但是,当从一个组切换到下一个组时,查询结果仍然需要一些客户端按摩才能正确显示相应的分区。

答案 2 :(得分:0)

你可以这样做:

$query = "SELECT DATE(date) as mydate, id FROM your_data_table ORDER BY mydate, id";
$result = $pdo->query($query);

$datas = array();
while(list($date, $id) = $result->fetch(PDO::FETCH_NUM)) {
  if(! isset($datas[$date]) $datas[$date] = array();
  $datas[$date][] = $id;
}

foreach($datas as $date => $ids} {
    echo $date.' - Count: '.count($ids)."\n";
    foreach($ids as $id) {
        echo $id."\n";
    }
}