ORDER BY有两列(只有一列有值)

时间:2015-07-07 22:57:18

标签: php mysql sql-order-by

我创建了一个简单的日历,一方面是时间点,另一方面是时间段。

MySQL表(一个多数为0的块表示:此处没有实际值,因为它是一个时间点,而不是一段时间)

+-------+------------+------------+-------------+-------------+
| title | timepoint1 | timepoint2 | timeperiod1 | timeperiod2 |
+-------+------------+------------+-------------+-------------+
| ABC   | 2015-07-12 | 12:30:00   | 0000-00-00  | 0000-00-00  |
| UPS   | 2015-07-12 | 15:00:00   | 0000-00-00  | 0000-00-00  |
| DEF   | 2015-07-30 | 08:00:00   | 0000-00-00  | 0000-00-00  |
| HIJ   | 0000-00-00 | 00:00:00   | 2015-07-16  | 2015-07-31  |
| KLM   | 0000-00-00 | 00:00:00   | 2015-08-21  | 2015-08-25  |
+-------+------------+------------+-------------+-------------+

我想要这样的输出

+-------+--------------------------+
| title | when?                    |
+-------+--------------------------+
| ABC   | 2015-07-12   12:30       |
| UPS   | 2015-07-12   15:00       |
| HIJ   | 2015-07-16 to 2015-07-31 |
| DEF   | 2015-07-30    8:00       |
| KLM   | 2015-08-21 to 2015-08-25 |
+-------+--------------------------+

正如你所看到的,我想按照他们的开始时间(无论是时间点还是一段时间)订购所有标题,也许包括12点等时间。

但是我应该如何编写查询,尤其是ORDER BY部分。如何添加WHERE子句,该子句仅选择此月或下个月的会议?

2 个答案:

答案 0 :(得分:1)

你可以将这两个字段合并并按顺序排列。

ORDER BY CONCAT(`timepoint1`,' ',`timepoint2`) ASC

看到某些字段可能为空,那么您将使用IF语句,例如:

ORDER BY CONCAT(IF(`timepoint1`!='0000-00-00',`timepoint1`,`timeperioid1`),' ',`timepoint2`) ASC

答案 1 :(得分:1)

SELECT title
, IF(timepoint1 = '0000-00-00'
   , CONCAT(timeperiod1, " to ", timeperiod2)
   , CONCAT(timepoint1, ' ', timepoint2)
) AS `when?`
FROM the_table
ORDER BY GREATEST(timepoint1, timeperiod1), timepoint2, timeperiod2
;

那就是说,为什么不只有两个DATETIME或TIMESTAMP字段("来自"和"到")? "时期"会使用' 00:00'时间,或者"点"会有"来自"和"到"彼此相等,或者可以有一个额外的"类型"某种领域。第一条评论也显示了一个很好的方式来涵盖一天的时间"。