【问题标题】:Order by two fields and possibly NULL values, in chronological order按时间顺序按两个字段和可能的 NULL 值排序
【发布时间】:2013-07-03 11:39:40
【问题描述】:

三个字段:

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

我是否需要在输出时对其进行操作?

感谢您的任何见解。

【问题讨论】:

  • 解决此类问题的方法是引入sortorder 列,活动应该按照发生的顺序排列,
  • 这实际上是一个好点,可能一目了然更容易理解,谢谢。

标签: php mysql sql-order-by


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    你能不能用:-

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

    【讨论】:

      【解决方案3】:

      没有尝试,但我认为这样的事情会起作用:

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

      【讨论】:

        【解决方案4】:

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

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

        如果是这样,解决方案就很明显了:

        order by coalesce(arrival, departure)
        

        意思是如果到达为空,使用出发代替。

        【讨论】:

          猜你喜欢
          • 2012-11-08
          • 2017-11-08
          • 2016-03-20
          • 2020-09-23
          • 1970-01-01
          • 2021-05-18
          • 1970-01-01
          • 2020-11-26
          • 1970-01-01
          相关资源
          最近更新 更多