Php 具有两列的ORDER BY(只有一列具有值)

Php 具有两列的ORDER BY(只有一列具有值),php,mysql,sql-order-by,Php,Mysql,Sql Order By,我创建了一个简单的日历,一方面有时间点,另一方面有时间段 MySQL表(一个包含很多0的块意味着:这里没有实际值,因为它是一个时间点,而不是一段时间) 我想要这样的输出 +-------+--------------------------+ | title | when? | +-------+--------------------------+ | ABC | 2015-07-12 12:30 | | UPS | 2015-07

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

MySQL表(一个包含很多0的块意味着:这里没有实际值,因为它是一个时间点,而不是一段时间)

我想要这样的输出

+-------+--------------------------+
| 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点等时间


但是我应该如何编写查询,尤其是按部分排序的查询。我怎样才能添加一个WHERE子句,只选择本月或下个月的会议?

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

ORDER BY CONCAT(`timepoint1`,' ',`timepoint2`) ASC
考虑到某些字段可能为空,您可以使用IF语句,如:

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

也就是说,为什么不只是有两个DATETIME或TIMESTAMP字段(一个“from”和一个“to”)?“Periods”将使用“00:00:00”时间,或者“points”将使“from”和“to”彼此相等,或者可能会有其他某种类型的“type”字段。所做的第一条评论也显示了一种覆盖一天“期间”的好方法。

您真的应该将日期和时间放在datetime数据类型下的同一列中。然后你有两个,一个是开始,一个是结束。如果这只是表示一个时间点,那么start==end。如果这表示一整天,则开始日期为当天,结束日期为当天。否则你会遇到这样的奇怪情况,你必须使用
case/when
grest
语句。谢谢!我不知道我为什么这么做。
ORDER BY CONCAT(IF(`timepoint1`!='0000-00-00',`timepoint1`,`timeperioid1`),' ',`timepoint2`) ASC
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
;