首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何只有在满足特定条件时才能按现场工作订货?

如何只有在满足特定条件时才能按现场工作订货?
EN

Stack Overflow用户
提问于 2016-07-06 07:45:34
回答 5查看 67关注 0票数 2

我只想通过字段topped_time对mysql查询结果排序,如果它早于now.For示例,如果topped_time是2016-7-6,则应该考虑它,但是如果topped_time是2016-7-16,则应该忽略它。

我试过了

代码语言:javascript
复制
SELECT * FROM `article` ORDER BY IF(`topped_time` < CURRENT_TIME(), '`topped_time` DESC', ''), `published_time` DESC

代码语言:javascript
复制
SELECT * FROM `article` ORDER BY CASE WHEN `topped_time=` < CURRENT_TIME() THEN `topped_time` END, `published_time` DESC

即使比现在晚了,topped_time仍在订货。

这张桌子是:

代码语言:javascript
复制
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');

这个截图的正确顺序应该是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,并且比现在晚,这应该被忽略。

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2016-07-06 08:54:29

我想这是你的选择

代码语言:javascript
复制
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 |
+----+---------------------+---------------------+

更新

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

代码语言:javascript
复制
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 |
+----+---------------------+---------------------+
票数 1
EN

Stack Overflow用户

发布于 2016-07-06 07:55:10

按自定义列的顺序,该列应确定顺序优先级:

代码语言:javascript
复制
SELECT *, 
    IF(`topped_time` < CURRENT_TIME(), 1, 0) AS topOrder 
FROM `article` 
ORDER BY topOrder DESC, `published_time` DESC
票数 1
EN

Stack Overflow用户

发布于 2016-07-06 07:55:51

试试这个:

代码语言:javascript
复制
SELECT * FROM `article`
ORDER BY CASE WHEN `topped_time=` < CURRENT_TIME()
              THEN 1
              ELSE 0
         END DESC,
         `published_time`  DESC

MySQL允许将布尔表达式计算为1和0。所以你可以试着:

代码语言:javascript
复制
SELECT * FROM `article`
ORDER BY `topped_time=` > CURRENT_TIME(),
         `published_time`
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38218738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档