【问题标题】:MYSQL Ordering For a Train Timetable PHP Over MidnightMYSQL 在午夜订购火车时刻表 PHP
【发布时间】:2015-07-03 23:32:00
【问题描述】:

我正在尝试按从车站出发的时间来订购火车时刻表集,但是当火车经过午夜时会出现问题。

以下是流入我的mysql数据库的数据示例。对于给定的火车时刻表,我有它的基本路线和每个车站的基本出发时间(由 y under sche 标记)。有时,我可能还会收到给定火车时刻表的修改出发时间的更新。

就其本身而言,上述内容不是问题,因为我根据 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 值是否意味着什么?在我看来,数据库缺少有关停靠顺序的重要信息,这将导致意外错误。
  • 计数是接收消息的顺序。但是我知道原始时间表的运行顺序(如果有帮助的话)。它在 sche 下标有 y。所以我知道站的顺序
  • 除非您按一个(或多个...)列排序,否则数据库中没有顺序。我也不知道 messages 是什么意思。如果有人进入一条新路线,忘记了停靠点并在稍后发布广告怎么办?你的整个系统崩溃了。
  • @jeroen 在我看来Count 只是一个自动递增的 ID 字段。

标签: php mysql sql select


【解决方案1】:

如果你想把午夜和早上 6 点之间的所有时间都放在其他时间之后,你可以这样做:

ORDER BY timeref < '06:00', timeref

【讨论】:

  • 我也有许多火车时刻表,其中火车从 02:00 开始,到 23:00 之前在车站停靠。如果我使用上面的代码,我认为它会以错误的方式解决这些问题。即它会纠正我的第一个问题,然后导致另一个问题?
  • 那么它应该如何知道将 02:00 放在列表的开头还是结尾?你不能同时拥有它。
  • 同意。我所知道的信息是我确实有原始时间表——即在上面的示例中,我确实有火车的运行顺序。即在sche下上面标有y
  • 我看不出这有什么帮助。卢顿原来的时间是01:00,更新的时间是01:10。他们都是清晨,所以他们的顺序是错误的。
【解决方案2】:

您可以使用的一个技巧是检查当前时间,并首先订购其后的所有timerefs(即今天的火车),然后再订购它之前的timerefs(即午夜后) :

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 是保留字,你应该用反引号保护它们。

【讨论】:

  • 这些是反引号,而不是正引号。
  • 谢谢穆雷尼克。有趣的想法。只是玩那个
  • 对保留字 cmets 给予提振
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
相关资源
最近更新 更多