0

如何在 PHP 中按日期对 SQL 查询分组进行排序...

我有这张桌子

id  date                  Title
1   2012-12-19 11:00:00   Value 10
2   2013-01-04 09:00:00   Value 15
3   2013-01-04 20:00:00   Value 18
4   2013-01-04 21:00:00   Value 5
5   2013-01-07 09:00:00   Value 8
6   2013-01-07 09:40:00   Value 11
7   2013-01-07 11:00:00   Value 12

我想像这样按月份排序

December 19
11:00:00      Value 10

January 04
09:00:00      Value 15
20:00:00      Value 18
21:00:00      Value 5

January 07
09:00:00      Value 8
09:40:00      Value 11
11:00:00      Value 12
4

4 回答 4

1

尝试以下查询并使用 PHP 循环来获得您想要的结果。您只需要在 PHP 循环中拆分 id、time 和 title 值来格式化数据以供显示。

SELECT
GROUP_CONCAT(id) AS id,
DATE_FORMAT(date,'%M %e') AS Date,
GROUP_CONCAT(DATE_FORMAT(date,'%H:%i:%s')) AS TimeValue,
GROUP_CONCAT(title) AS Title
FROM abc
GROUP BY DATE(date)
ORDER BY MONTH(date) DESC

输出

ID          DATE            TIMEVALUE                       TITLE
1           December 19     11:00:00                        Value 10
2,3,4       January 4       09:00:00,20:00:00,21:00:00      Value 15,Value 18,Value 5
5,6,7       January 7       09:00:00,09:40:00,11:00:00      Value 8,Value 11,Value 12

SQL小提琴:http ://sqlfiddle.com/#!2/ec3a8/6

更新:

输出

ID          DATE                TIMEVALUE
1           December 19         11:00:00___Value 10
2,3,4       January 4           09:00:00___Value 15,20:00:00___Value 18,21:00:00___Value 5
5,6,7       January 7           09:00:00___Value 8,09:40:00___Value 11,11:00:00___Value 12

PHP 代码:我假设您根据上述查询输出有如下数组。

<?php
$data = array(
        0=>array(
            'id'=>1,
            'date'=>'December 19',
            'time_value'=>'11:00:00___Value 10',
        ),
        1=>array(
            'id'=>2,3,4,
            'date'=>'January 4',
            'time_value'=>'09:00:00___Value 15,20:00:00___Value 18,21:00:00___Value 5',
        ),
        2=>array(
            'id'=>5,6,7,
            'date'=>'January 7',
            'time_value'=>'09:00:00___Value 8,09:40:00___Value 11,11:00:00___Value 12',
        )    
    );
if(is_array($data))
{
    foreach($data as $value)
    {
        if(is_array($value))
        {
            echo '<br />'.$value['date'].'<br />';
            $arrTime = explode(',', $value['time_title']);
            if($arrTime)
            {
                foreach($arrTime as $time)
                {
                    $arrTimeTitle = explode('_', $time);
                    echo $arrTimeTitle[0]."&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;".$arrTimeTitle[1]."<br />";
                }
            }
        }
    }
}
?>

最终的 PHP 输出:

December 19
11:00:00     Value 10

January 4
09:00:00     Value 15
20:00:00     Value 18
21:00:00     Value 5

January 7
09:00:00     Value 8
09:40:00     Value 11
11:00:00     Value 12
于 2013-01-23T05:50:48.303 回答
0

您应该尝试使用 PHP 而不是 SQL 来执行此操作。

您可以使用 ORDER BY 日期通过 SQL 检索数据,然后使用 PHP 使用“date()”函数捕获日期格式,然后仅从日期字段和标题字段打印时间部分,直到日期部分与之前抓取的日期部分匹配。

于 2013-01-23T05:23:17.170 回答
0

GROUP_CONCAT在你的 sql 中使用函数。您可以在一个查询中实现这一点,而不是在 PHP 中尝试多个循环。

例如:-

SELECT 
          id,GROUP_CONCAT(date, value, '+') 
FROM 
          tablename 
GROUP BY 
          date 
ORDER BY 
          date DESC;
于 2013-01-23T05:12:55.460 回答
0

使用此查询

SELECT
  id,
  DATE_FORMAT(date,'%M %e') as DateValue,
  DATE_FORMAT(date,'%h:%i:%s %p') as TimeValue,
  GROUP_CONCAT(Title)
from mytable
group by DATE(date)
ORDER BY MONTH(date) desc 

输出

id  |   DateValue   |   TimeValue       |   Title
----------------------------------------------------------
1   |   December 19 |   11:00:00        |   Value   10 
2   |   January 4   |   09:00:00        |   Value 15,Value 18,Value 5 
5   |   January 7   |   09:00:00        |   Value 8,Value 11,Value 12 

在前端使用 php explode Title ,你会得到一个数组

$titles = explode(',',$row['Title']);
于 2013-01-23T05:16:36.447 回答