两个日期字段上的Mysql查询排序

两个日期字段上的Mysql查询排序,mysql,Mysql,我试图对两个日期字段(开始和结束)上的数据进行排序。但有一个特殊的情况。它应该在两个字段上并行排序 我的用户表 id | start | end --------------------------------------------------- 1 | 2015-02-24 00:00:00 | 2015-02-18 00:00:00 --------------------------------------------------- 2 | 2

我试图对两个日期字段(开始和结束)上的数据进行排序。但有一个特殊的情况。它应该在两个字段上并行排序

我的用户表

id | start                  | end
---------------------------------------------------
1  | 2015-02-24 00:00:00    | 2015-02-18 00:00:00
---------------------------------------------------
2  | 2015-02-24 00:00:00    | 2015-02-03 00:00:00
---------------------------------------------------
3  | 2015-02-25 00:00:00    | NULL
---------------------------------------------------
4  | 2015-02-23 00:00:00    | NULL
---------------------------------------------------
预期产出:

id | start                  | end
---------------------------------------------------
3  | 2015-02-25 00:00:00    | NULL
---------------------------------------------------
4  | 2015-02-23 00:00:00    | NULL
---------------------------------------------------
1  | 2015-02-24 00:00:00    | 2015-02-18 00:00:00
---------------------------------------------------
2  | 2015-02-24 00:00:00    | 2015-02-03 00:00:00
---------------------------------------------------
如您所见,id为1的行位于第三位,因为存在结束日期的值,并且该值小于上一个记录开始日期

表应同时在两个字段上排序。它应该给予终端字段更高的优先级。但如果结束字段为空,则应对开始字段进行排序

我尝试了以下查询:

SELECT * FROM `users` order by end DESC, start DESC 
SELECT * FROM `users` order by start DESC,least(start,end) DESC 
<以上的查询给了我一个类似的结果,但是正如你所看到的,它没有考虑结束日期。我的意思是确实如此,但这不是我想要的:

id | start                  | end
---------------------------------------------------
3  | 2015-02-25 00:00:00    | NULL
---------------------------------------------------
1  | 2015-02-24 00:00:00    | 2015-02-18 00:00:00
---------------------------------------------------
2  | 2015-02-24 00:00:00    | 2015-02-03 00:00:00
---------------------------------------------------
4  | 2015-02-23 00:00:00    | NULL
---------------------------------------------------
下面是要执行并尝试的创建表和示例数据

--
-- Table structure for table `users`
--

CREATE TABLE IF NOT EXISTS `users` (
`id` int(10) NOT NULL,
  `start` datetime DEFAULT NULL,
  `end` datetime DEFAULT NULL
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

--
-- Dumping data for table `users`
--

INSERT INTO `users` (`id`, `start`, `end`) VALUES
(1, '2015-02-24 00:00:00', '2015-02-03 00:00:00'),
(2, '2015-02-24 00:00:00', '2015-02-18 00:00:00'),
(3, '2015-02-25 00:00:00', NULL),
(4, '2015-02-23 00:00:00', NULL);

--
-- Indexes for dumped tables
--

--
-- Indexes for table `users`
--
ALTER TABLE `users`
 ADD PRIMARY KEY (`id`);

ALTER TABLE `users`
MODIFY `id` int(10) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=5;

好的,我想我明白你想做什么-这个问题有点让人困惑。试试这个:

SELECT * FROM `users` order by IF(end IS NULL, start, end) DESC
有关更多详细信息,请参见查询:

SELECT * 
FROM `users` 
order by COALESCE(end,start)  DESC, start DESC 
结果:

| ID |                           START |                 END |
|----|---------------------------------|---------------------|
|  3 | February, 25 2015 00:00:00+0000 |              (null) |
|  4 | February, 23 2015 00:00:00+0000 |              (null) |
|  1 | February, 24 2015 00:00:00+0000 | 2015-02-18 00:00:00 |
|  2 | February, 24 2015 00:00:00+0000 | 2015-02-03 00:00:00 |

好吧,这是违反直觉的…你只是想这样:
SELECT*从用户订单中按ASC结束,开始描述?或者请更好地解释你需要提供更多关于你的分类要求的细节。我们什么时候看
开始
?我们什么时候看
end
?我们如何处理
NULL
?您的尝试有什么问题?在您的预期输出中,您在前面输入了“NULL”值,因为它们较低,但您在2015-02-18之后输入了2015-02-03。你想在结束日期做升序还是降序排序?你能提供一个“真实世界”的例子,说明在开始之前就结束的事情吗?并定义“以前的记录”,这是完美的!谢谢。那也很好用。但我不得不勾选贾斯汀的答案,因为他领先了一个小时。谢谢你的替补。