首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带条件的MySql排序

问带条件的MySql排序
EN

Stack Overflow用户
提问于 2015-01-15 15:42:39
回答 3查看 101关注 0票数 0

我有一张有下列字段的桌子。

代码语言:javascript
复制
Table
+----+-------+---------+------------+
| id | title | approve | expirydate |
+----+-------+---------+------------+

我想要按“呼气日期”过滤行,因为我希望先得到与今天相距很远的数据行(呼气日期字段的降序),如果任何一行没有“呼气日期”,或者它已经过期,则按id字段的降序排序。

示例(假设今天是== 2015-01-15)

代码语言:javascript
复制
+----+-------+---------+------------+
| id | title | approve | expirydate |
+----+-------+---------+------------+
| 1  | ttle1 | 1       | 2015-01-01 |
+----+-------+---------+------------+
| 2  | ttle2 | 1       | 2015-02-15 |
+----+-------+---------+------------+
| 3  | ttle3 | 1       |            |
+----+-------+---------+------------+
| 4  | ttle4 | 1       | 2015-01-20 |
+----+-------+---------+------------+

预期结果

代码语言:javascript
复制
+----+-------+---------+------------+
| 2  | ttle2 | 1       | 2015-02-15 |
+----+-------+---------+------------+
| 4  | ttle4 | 1       | 2015-01-20 |
+----+-------+---------+------------+
| 3  | ttle3 | 1       |            |
+----+-------+---------+------------+
| 1  | ttle1 | 1       | 2015-01-01 |
+----+-------+---------+------------+

是否可以在一个MySQL查询中获得这些条件下的值??我真的没有主意做this.Any帮助感激地收到:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-01-15 16:07:11

代码语言:javascript
复制
select * from `table` order by
    ifnull(expirydate>curdate(),0) desc,
    if(expirydate>curdate(),expirydate,null) desc,
    id desc
  • ifnull(expirydate>curdate(),0) desc需要在过期前或在expirydate中放置null。ifnull需要将null in expirydate (expirydate>curdate()返回null)与已过期(expirydate>curdate()返回0)的处理方式相同。
  • if(expirydate>curdate(),expirydate,null) desc需要通过提供相同的排序值(在本例中为null,但对于给定的数据类型可以是任何其他有效值),在不影响过期的情况下由expirydate按降序顺序订购,或者使用expirydate中的null进行排序。
  • id desc顺序由id降序。影响已过期或在expirydate中使用expirydate,但在相同的expirydate中未过期。
票数 0
EN

Stack Overflow用户

发布于 2015-01-15 15:55:27

我认为更多的数据将有助于理解结构,但是下面的查询会返回您想要的内容吗?

假设您的表名是tbl,那么:

代码语言:javascript
复制
SELECT *
  FROM
tbl
order by - datediff(now(), coalesce(expirydate, now())) desc , id desc;
票数 0
EN

Stack Overflow用户

发布于 2015-01-15 16:41:29

代码语言:javascript
复制
SELECT id, title, approve, expirydate FROM
(SELECT id, title, approve, expirydate
FROM tableName
WHERE expirydate > '2015-01-15'
ORDER BY expirydate DESC) AS t1

UNION

SELECT id, title, approve, expirydate FROM
(SELECT id,title, approve, expirydate
FROM tableName
WHERE expirydate < '2015-01-15' OR expirydate IS NULL
ORDER BY id DESC) AS t2
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27967239

复制
相关文章

相似问题

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