PHP / MySQL:按时间排序,然后按日期排序

时间:2011-10-05 15:11:02

标签: php mysql sql sorting

我偶然发现了一个我认为很容易解决的问题,但似乎让我发疯了。所以,我试图按时间排序一些MySQL记录,然后根据日期对它们进行“分组”。例如,这是我的MySQL数据:

+----+------------+----------+---------------------------+--------+
| id | date       | time     | entry                     | status |
+----+------------+----------+---------------------------+--------+
| 21 | 2011-10-05 | 09:42:06 | All systems online.       |      1 |
| 22 | 2011-10-05 | 09:43:09 | Maintenance starting.     |      2 |
| 23 | 2011-10-04 | 08:42:06 | Systems online and ready. |      1 |
| 24 | 2011-10-05 | 09:44:30 | Systems are offline.      |      0 |
+----+------------+----------+---------------------------+--------+

因此,我用来获取所有内容的查询是:

SELECT * FROM status order by date ASC;

产生以下结果:

+----+------------+----------+---------------------------+--------+
| id | date       | time     | entry                     | status |
+----+------------+----------+---------------------------+--------+
| 21 | 2011-10-05 | 09:42:06 | All systems online.       |      1 |
| 22 | 2011-10-05 | 09:43:09 | Maintenance starting.     |      2 |
| 24 | 2011-10-05 | 09:44:30 | Systems are offline.      |      0 |
| 23 | 2011-10-04 | 08:42:06 | Systems online and ready. |      1 |
+----+------------+----------+---------------------------+--------+

PHP输出是个问题。所以,现在的输出是:

2011年10月4日

  • 系统在线并准备就绪。 [08:42 AM]

2011年10月5日

  • 所有在线系统。 [09:42 AM]

  • 维护开始。 [09:43 AM]

  • 系统处于离线状态。 [09:44 AM]

我想要的输出是什么:

2011年10月5日   - 系统离线。 [09:44 AM]

  • 维护开始。 [09:43 AM]

  • 所有在线系统。 [09:42 AM]

2011年10月4日

  • 系统在线并准备就绪。 [08:42 AM]

基本上,我想要按日期分组的所有内容(最新的第一个),我希望最近的时间位于顶部,而不是底部。

这是我的PHP代码:

function getUpdates() {
    global $db;
    $updchk = "";
    $entries = $db->GetAll("SELECT * FROM status order by date DESC;");
    if (!$entries) { ?>
        <p>No entries in the database, yet.</p>
  <?php } else
    foreach ($entries as $entry) {
        if (ConvertDate($entry['date']) != $updchk) { ?>
            <h4><?php echo ConvertDate($entry['date']); ?></h4>
            <p><?php echo $entry['entry']; ?><span class="timestamp"> [<?php echo strftime('%I:%M %p', strtotime($entry['time'])); ?>]</span></p>
            <?php $updchk = ConvertDate($entry['date']); ?>
        <?php } else { ?>
            <p><?php echo $entry['entry']; ?><span class="timestamp"> [<?php echo strftime('%I:%M %p', strtotime($entry['time'])); ?>]</span></p>
        <?php }
    } ?>
<?php } ?>

感谢任何帮助。

谢谢!

6 个答案:

答案 0 :(得分:18)

只需在ORDER BY中添加一个额外的子句吗?

SELECT ...
FROM status
ORDER BY `date` DESC, `time` DESC

您可以根据需要对任意数量(或很少)的字段进行排序,如果需要,甚至可以对任意表达式进行排序。

答案 1 :(得分:4)

将您的查询更改为

SELECT * 
FROM status 
order by `date` desc, `time` desc;

答案 2 :(得分:3)

按日期排序,然后按SQL排序,

SELECT * FROM status ORDER BY date DESC, time DESC;

答案 3 :(得分:3)

试试这个:

SELECT * FROM `status` ORDER BY `date`, `time` DESC 

答案 4 :(得分:1)

SELECT * FROM `status` ORDER BY `date` DESC, `time` DESC

适用于您的代码

答案 5 :(得分:0)

SELECT * FROM状态顺序按日期(日期)asc,time desc;