【问题标题】:Display SQL values group in date按日期显示 SQL 值组
【发布时间】:2013-01-06 12:37:51
【问题描述】:

如何在 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

【问题讨论】:

  • SQL 不适合表示层,它是用来获取数据的。然后让 PHP 做剩下的事情

标签: php sql sorting group-by


【解决方案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

【讨论】:

  • @RicardoCapistran:对于 PHP,请检查答案的更新部分。
【解决方案2】:

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

EG:-

SELECT 
          id,GROUP_CONCAT(date, value, '+') 
FROM 
          tablename 
GROUP BY 
          date 
ORDER BY 
          date DESC;

【讨论】:

    【解决方案3】:

    您应该尝试使用 PHP 而不是 SQL。

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

    【讨论】:

      【解决方案4】:

      使用这个查询

      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']);
      

      【讨论】:

      • DATE_FORMAT(date,'%h:%i:%s') as TimeValue 将以 12 小时格式返回时间,您应该使用 24 小时格式,因为问题时间是 24 小时格式.所以使用 %H 而不是 %h
      猜你喜欢
      • 2021-03-10
      • 1970-01-01
      • 2013-10-26
      • 2012-03-05
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多