【问题标题】:PHP/mysql: how do I display records sorted by time and grouped by date?PHP/mysql:如何显示按时间排序并按日期分组的记录?
【发布时间】:2011-06-22 05:52:21
【问题描述】:

我需要显示按日期分组并按时间排序的记录。在 mysql 表中,我有一个名为 entry_time 的字段,其中存储了 php time() 值。任何想法最紧凑和最简单的方法是什么?

例如:我需要这样的显示器:

21st April
3:00 pm
3:50 pm

22 April
5:00 am
4:00 pm

【问题讨论】:

  • 也许你显示你的 SQL 查询?
  • 你的桌子怎么样?你有单独存储的日期和时间吗?
  • 我要求 sql 查询...正如我所说,我的表有一个 timestamp 字段,用于存储 entry_time id(int,primary),entry_time(timestamp) 期间的时间戳
  • 那么表结构会很好......

标签: php mysql date datetime


【解决方案1】:

粗略的半伪代码:

$records = /* SELECT * FROM `records` ORDER BY `entry_time` */;

$date = null;
foreach ($records as $record) {
    $currentDate = date('Ymd', $record['entry_time']);
    if ($currentDate != $date) {
        printf('<h1>%s</h1>', date('Y-m-d', $record['entry_time']));
    }
    $date = $currentDate;

    echo date('H:i', $record['entry_time']);
}

【讨论】:

  • 你忘记了 else 声明。
  • 这里需要else 做什么?
  • 为什么不把$date = $currentDate; 调用放在if 中呢?为您节省一些作业,您只需更改$date if $currentDate != $date
【解决方案2】:

如果您使用 PHP 处理查询结果,请考虑编写一个简单的查询来按日期对记录进行排序:

SELECT NameOfMyThing, MyDateField FROM MyTable ORDER BY MyDateField DESC

然后使用PHP读取结果:

$last_day = '';
while ($row = $query_result->fetch()) {
    $date = new DateTime($row->['MyDateField']);

    $day = $date->format('j F');     // '9 April'
    $time = $date->format('g:i a');  // '9:05 am'

    if ($day != $last_day) {
        print $day . "\n";
        $last_day = $day;
    }

    print $time . " " . $row->['NameOfMyThing'];
}

这里的想法是记住你看到的最后一天,并且只输出日期变化的日期。

(代码未经测试,仅针对可读性进行了优化)。

【讨论】:

    【解决方案3】:

    有一个多维数组。

    $datetime = array("April 21st" => array("5:00a.m", "4:00p.m"), "April 22nd" => array(...));
    

    然后你可以分别根据日期和时间进行排序。

    【讨论】:

    • 就我个人而言,我会一次查询一行,并在从该行返回数据时构建数组。您可以进行一种插入排序,也可以在完成构建后对数组进行排序。我没有尝试编写查询,因为如果日期都在一个字段中,我不知道有任何方法只按字段的“部分”进行排序。
    • 您真的会一次查询一行吗?假设有一年的数据,每天 3 个条目。这就是您将针对数据库进行的 1,000 多个查询。除此之外,您将在事后使用 PHP 的 sort() 进行字符串比较。抱歉,我认为这是造成严重瓶颈的原因。
    • 不,抱歉,一次没有一行。执行 mysql_query,然后执行 while(mysql_fetch_row ... !== false)(极端伪代码,我不会使用内置函数,但我不记得 PDO 的东西)
    【解决方案4】:

    当您将time() 存储在数据库中时,最简单的方法是:

    1. 使用time()按列对表格进行排序。
    2. 从表中查询每条记录的时间戳(我假设您只需要日期和时间)。
    3. 对于结果中的每一行,调用date() 两次:一天和一个月一次,一小时一次。已保存上次使用的日期,如果它们相同,则将下次放入与之前相同的数组元素(我假设您使用 LainIwakura 存储此类数据的解决方案)。
    4. 以您想要的方式显示它。

    【讨论】:

      【解决方案5】:

      这样的 sql 查询(以 wordpress 为例)会以正确的顺序为您获取记录,并具有正确的格式:

      select date_format(post_date, "%d %b")  as day, date_format(post_date, "%T") as time from wp_posts;
      

      然后,您可以遍历这个数组,并在第一列发生变化时开始一个新的“日”标题。

      我真的不建议像@Lainlwakura 的评论所建议的那样一次查询数据库 - PHP 很慢,迭代单行查询很慢。 PHP 数组排序,尤其是在字符串键上,速度非常慢。如果您要列出跨越一年左右的记录,那么这种方法将行不通。

      让mysql为你做尽可能多的事情。

      【讨论】:

        【解决方案6】:

        我可能想得太简单了,但猜想可以这样做:

        SELECT DATE(`datefield`) `date`, TIME(`datefield`) `time` FROM `yourtable` ORDER BY `datefield` ASC;
        

        然后就用 PHP 来展示它。 MySQL 只是用于获取数据,而不是用于显示它。 :)

        【讨论】:

          【解决方案7】:

          查询:

          SELECT DATE_FORMAT( entry_time, '%D %M' ) as date,
                 GROUP_CONCAT( DATE_FORMAT( entry_time, '%h:%i %p' )
                               ORDER BY entry_time ASC
                               SEPARATOR '<br />' ) as times
          FROM yourtable
          GROUP BY DATE( entry_time )
          ORDER BY entry_time
          

          结果:

          > date        times
          
          > 21st April  3:00 PM<br />3:50 PM
          
          > 22st April  5:00 AM<br />4:00 PM
          

          那么你可以通过它:

          foreach($result as $row) {
             echo $row->date. '<br />'. $row->times. '<br />';
          }
          

          编辑: 好处是所有的排序和格式化都是在 mysql 引擎中完成的,所以你已经准备好显示结果了

          edit2: 该查询将为您提供您想要的确切结果:

          SELECT CONCAT( DATE_FORMAT( entry_time, '%D %M' ), "<br />\n",
                         GROUP_CONCAT( DATE_FORMAT( entry_time, '%h:%i %p' )
                                       ORDER BY entry_time ASC
                                       SEPARATOR '<br />' ), "<br /><br />\n"
                 ) as dates
          FROM yourtable
          GROUP BY DATE( entry_time )
          ORDER BY entry_time
          

          使用 foreach(或任何其他数组函数)来遍历它:

          foreach($result as $row) { echo $row-&gt;dates; }

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-08-01
            • 2011-12-01
            • 2011-10-22
            • 2021-02-03
            • 1970-01-01
            • 2013-10-28
            相关资源
            最近更新 更多