mysql - 如何只在满足特定条件的情况下现场下订单?

标签 mysql sql sql-order-by

我想仅在早于现在的情况下按字段toppped_time对mysql查询结果进行排序。例如,如果topped_time是2016-7-6,则应该考虑它,但如果topped_time是2016-7-16,则它应该被忽略。

我试过了

SELECT * FROM `article` ORDER BY IF(`topped_time` < CURRENT_TIME(), '`topped_time` DESC', ''), `published_time` DESC

SELECT * FROM `article` ORDER BY CASE WHEN `topped_time=` < CURRENT_TIME() THEN `topped_time` END, `published_time` DESC

即使比现在晚,仍然按 topped_time 排序。

这是表格:

CREATE TABLE `article` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `published_time` datetime DEFAULT '0000-00-00 00:00:00',
  `topped_time` datetime DEFAULT '0000-00-00 00:00:00'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `article` (`id`, `published_time`, `topped_time`) VALUES
(1, '2016-07-05 22:01:14', '0000-00-00 00:00:00'),
(2, '2016-07-05 22:01:23', '0000-00-00 00:00:00'),
(3, '2016-07-05 22:01:25', '2016-07-07 00:00:00'),
(4, '2016-07-05 22:01:27', '0000-00-00 00:00:00'),
(5, '2016-07-05 22:01:29', '0000-00-00 00:00:00');

enter image description here

从这个截图来看,正确的顺序应该是id:4,5,3,2,1,因为id 4的topped_time是2016-07-06 00:00:00,比现在早,应该是第一个。而id 3的topped_time是2016-07-07 00:00:00,比现在晚,应该被忽略。

正确的查询是什么,或者是不可能的?

最佳答案

我想这是你的选择:

SELECT * FROM `article`
ORDER BY 
    IF (`topped_time` < NOW(), `topped_time`, '0000-00-00 00:00:00') DESC, 
    `published_time`  DESC

+----+---------------------+---------------------+
| id | published_time      | topped_time         |
+----+---------------------+---------------------+
|  4 | 2016-07-05 22:01:27 | 2016-07-06 00:00:00 |
|  6 | 2016-07-05 22:01:28 | 2016-05-06 00:00:00 |
|  5 | 2016-07-05 22:01:29 | 0000-00-00 00:00:00 |
|  3 | 2016-07-05 22:01:25 | 2016-07-17 00:00:00 |
|  2 | 2016-07-05 22:01:23 | 0000-00-00 00:00:00 |
|  1 | 2016-07-05 22:01:14 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+

更新

您可能会注意到,我添加了额外的行来证明您的解决方案是错误的

SELECT * FROM article 
ORDER BY topped_time < CURRENT_TIME() AND 
         topped_time DESC, published_time DESC;

+----+---------------------+---------------------+
| id | published_time      | topped_time         |
+----+---------------------+---------------------+
|  6 | 2016-07-05 22:01:28 | 2016-05-06 00:00:00 |
|  4 | 2016-07-05 22:01:27 | 2016-07-06 00:00:00 |
|  5 | 2016-07-05 22:01:29 | 0000-00-00 00:00:00 |
|  3 | 2016-07-05 22:01:25 | 2016-07-17 00:00:00 |
|  2 | 2016-07-05 22:01:23 | 0000-00-00 00:00:00 |
|  1 | 2016-07-05 22:01:14 | 0000-00-00 00:00:00 |
+----+---------------------+---------------------+

关于mysql - 如何只在满足特定条件的情况下现场下订单?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38218738/

相关文章:

Python/MySQLdb 从 CSV 导入数据封装

MySql:查询多个相同的动态表

sql - 如何获得“不存在”查询的最大值

mysql - MySQL 中何时使用单引号、双引号和反引号

mysql - 如何在 Mysql 中将人类日期转换为 unix 时间戳?

php 在向数据库中插入一个值之前检查数据库中的值

php - 为什么这不更新 MySQL 数据库?

php - MySql 不同的排序条件

MYSQL 分组依据和排序依据

mysql - 根据辅助列中的值选择唯一行