MySql按条件排序

时间:2015-01-15 15:42:39

标签: mysql

我有一个包含以下字段的表格。

Table
+----+-------+---------+------------+
| id | title | approve | expirydate |
+----+-------+---------+------------+

我想通过expirydate过滤行,因为我希望首先获得远离今天expirydate的行(expirydate字段的降序)以及任何行没有' t' expirydate'或者已经过期的ID字段的降序排序。

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

+----+-------+---------+------------+
| 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 |
+----+-------+---------+------------+

预期结果

+----+-------+---------+------------+
| 2  | ttle2 | 1       | 2015-02-15 |
+----+-------+---------+------------+
| 4  | ttle4 | 1       | 2015-01-20 |
+----+-------+---------+------------+
| 3  | ttle3 | 1       |            |
+----+-------+---------+------------+
| 1  | ttle1 | 1       | 2015-01-01 |
+----+-------+---------+------------+

是否可以在一个MySQL查询中获取具有这些条件的值?我真的不知道这样做。任何帮助都感激地收到了:)

3 个答案:

答案 0 :(得分:0)

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

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

SELECT *
  FROM
tbl
order by - datediff(now(), coalesce(expirydate, now())) desc , id desc;

答案 1 :(得分:0)

select * from `table` order by
    ifnull(expirydate>curdate(),0) desc,
    if(expirydate>curdate(),expirydate,null) desc,
    id desc
  • ifnull(expirydate>curdate(),0) desc需要在到期之前过期或在null中使用expirydateifnull需要在nullexpirydate返回expirydate>curdate())中处理null与已过期expirydate>curdate()返回0)相同的方式{/ 1}}。
  • if(expirydate>curdate(),expirydate,null) desc需要按expirydate降序排序,而不会影响已过期,或null expirydatenull提供相同的排序值id desc在这种情况下,但它可以是给定数据类型的任何其他有效值。)
  • idnull降序排列。影响已过期或expirydate中的expirydate且未使用同一{{1}}过期。

答案 2 :(得分:0)

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