3

三个字段:

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

提供到达日期时效果很好。arrival什么时候null,我最终得到一张这样的桌子

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'];
}

我是否需要在输出时操作它?

感谢您的任何见解。

4

4 回答 4

3

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

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

于 2013-07-03T11:59:52.483 回答
1

Did not try, but I think something like this would work:

SELECT `id`, `activity`, `arrival`, `departure`
FROM `activities` 
ORDER BY 
    CASE WHEN `arrival` IS NULL THEN `departure` END ASC,
    `departure` ASC
;
于 2013-07-03T11:56:14.330 回答
1

你能不能用:-

ORDER BY IFNULL(Activity.arrival, Activity.departure)
于 2013-07-03T11:54:18.780 回答
1

您的问题本质上来自于您希望如何对这些进行排序的模棱两可。如果您可以指定要用于排序的规则,那么在 SQL 中编写该规则就变得容易了。

例如,我可能会猜测,如果到达不为空,则按到达排序。如果到达时间不为空,则使用出发时间,因此出发时间先于下一个到达时间。那对你有用吗?

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

order by coalesce(arrival, departure)

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

于 2013-07-03T12:13:40.960 回答