两个日期字段上的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。你想在结束日期做升序还是降序排序?你能提供一个“真实世界”的例子,说明在开始之前就结束的事情吗?并定义“以前的记录”,这是完美的!谢谢。那也很好用。但我不得不勾选贾斯汀的答案,因为他领先了一个小时。谢谢你的替补。