MYSQL 排序用于火车时刻表 PHP 跨越午夜

3
我正在尝试按照车站出发时间对火车时刻表进行排序,但当火车跨越午夜时会出现问题。下面是流入我的mysql数据库的数据示例。对于给定的火车时刻表,我有其基本路线和每个站点基本的出发时间(用 sche 下的 y 标记)。不时地,我可能还会收到针对某个火车时刻表修正出发时间的更新。就本身而言,这不是问题,因为我可以根据 timeref 对我的数据进行排序。然而,当火车跨过午夜时,我的问题就来了。这是因为我收到的时间格式是纯24小时格式-即01:00。
Count   Location       Trainid      Timeref     Sche     Update

  1      London          t256         22:10        y
  2      Cricklewood     t256         23:00        y
  3      Luton           t256         01:00        y 
  4      Leicester       t256         02:00        y
  5      Doncaster       r659         06:00                 y
  6      Luton           t256         01:10                 y
  7      Sheffield       y783         05:00                 y

我希望按照原始时间表的顺序展示以下数据,并将卢顿的更新时间更改为01:10。

 London        t256      22:10
 Cricklewood   t256      23:00 
 Luton         t256      01:10
 Leicester     t256      02:00

除了火车跨过午夜的情况外,下面的代码都能正常运行。
 $stmt3=$mysql_link->prepare("SELECT count,trainid,location,timeref,sche,update FROM (SELECT count,trainid,location,timeref,sche,update FROM darwinall WHERE trainid=:trainid ORDER BY count DESC) as temp GROUP BY location ORDER BY timeref ASC");
              $stmt3->execute(array(':trainid'=>$trainid));
 foreach($stmt3->fetchAll(PDO::FETCH_ASSOC) as $row3) {
 echo result.................
 }

所以,与上面的结果不同,我得到了错误的结果。
Luton         t256      01:10
Leicester     t256      02:00
London        t256      22:10
Cricklewood   t256      23:00 

count 值有什么意义吗?在我看来,数据库缺少关于站点顺序的重要信息,这将导致意外的错误。 - jeroen
计数是消息接收的顺序。但是我知道原始时间表运行顺序(如果有帮助的话)。它标有“sche”下面的y。因此,我知道站点的顺序。 - user2635961
除非您按一个(或多个)列排序,否则数据库中没有顺序。我也不知道“消息”是什么意思。如果有人输入新路线,忘记停靠站并稍后添加它,则整个系统将崩溃。 - jeroen
@jeroen 在我看来,Count 只是一个自动递增的 ID 字段。 - Barmar
2个回答

3
如果您想将午夜到上午6点之间的所有时间放在其他时间之后,可以这样做:
ORDER BY timeref < '06:00', timeref

我还有很多列火车的时间表,其中一些列车从02:00开始,并在各个站点停留直到晚上23:00左右。如果我使用上面的代码,我认为它会把这些时间表搞反。也就是说,它会解决我的第一个问题,但同时会引起另一个问题。 - user2635961
2
那么它应该如何知道将02:00放在列表的开头还是结尾?你不能两全其美。 - Barmar
同意。我知道的信息是,我有原始时间表 - 即在上面的示例中,我有火车的运行顺序。即在上面的时间表下方标有“y”。 - user2635961
我不明白那有什么帮助。卢顿的原始时间是01:00,更新后的时间是01:10。它们都是清晨,所以它们会排列错误。 - Barmar

1

你可以使用一个小技巧来检查当前时间,首先将所有 timeref(即今天的火车)排序,然后再将所有 timeref(即午夜后的火车)排序:

SELECT    `count`, trainid, location, timeref, sche, `update` 
FROM      (SELECT   `count`, trainid, location, timeref, sche, `update` 
           FROM     darwinall 
           WHERE    trainid=:trainid 
           ORDER BY `count` DESC) AS temp 
GROUP BY location 
ORDER BY timeref < CURRENT_TIME() ASC, timeref ASC

顺便说一下:countupdate是保留字,你应该用反引号保护它们。


这些是反引号,不是前引号。 - Barmar
谢谢Mureinik。有趣的想法。正在试玩那个。 - user2635961
放弃了保留字注释的提升。 - user2635961

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接