按时间顺序按两个字段排序,可能还有NULL值

时间:2013-07-03 11:39:41

标签: php mysql sql-order-by

三个领域:

Activity (varchar), Arrival (time), Departure (time)

我正在尝试生成这样的输出表:

Activity                    Arrival        Departure
Travel to Hotel             9:00           -
Depart Hotel for Big Ben    -              10:00
Sight-seeing Big Ben        12:00          13:00

-表示我的表中的NULL值。

我目前正在查询我的查询:

ISNULL(Activity.arrival), Activity.arrival ASC

在提供抵达日期时效果很好。当arrivalnull时,我最终会得到一张像这样的表

Activity                       Arrival        Departure
Travel to Hotel                9:00           -
Sight-seeing Big Ben           12:00          13:00 // problem!
Depart Hotel for Big Ben       -              10:00 // should be up one. 

我不确定我是否可以使用纯SQL实现此目的。

正在进行的查询是:

SELECT `id`, `activity`, `arrival`, `departure` FROM `activities` ORDER BY ISNULL(`arrival`) ASC, `arrival` ASC

我只是在输出:

foreach($r as $k) {
    echo $k['activity'] . ' ' . $k['arrival'] . ' ' . $k['departure'];
}

我是否需要在输出处理它?<​​/ p>

感谢您的任何见解。

4 个答案:

答案 0 :(得分:3)

您可以使用COALESCE()这将返回第一个非空值。

ORDER BY COALESCE(Activity.arrival, Activity.departure)

答案 1 :(得分:1)

你可以使用: -

ORDER BY IFNULL(Activity.arrival, Activity.departure)

答案 2 :(得分:1)

没试过,但我觉得这样的事情会奏效:

SELECT `id`, `activity`, `arrival`, `departure`
FROM `activities` 
ORDER BY 
    CASE WHEN `arrival` IS NULL THEN `departure` END ASC,
    `departure` ASC
;

答案 3 :(得分:1)

您的问题主要来自于您希望如何排序的模糊性。如果您可以指定要排序的规则,则可以轻松地在SQL中对该规则进行编码。

例如,我可能会猜到,如果到达不为空,请按到货排序。如果抵达时间不为空,请使用出发时间,以便出发在下次抵达时间之前。这对你有用吗?

如果是这种情况,解决方案就变得明显了:

order by coalesce(arrival, departure)

意思是如果到达为空,请改用离开。

相关问题