我有一个包含以下字段的表格。
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查询中获取具有这些条件的值?我真的不知道这样做。任何帮助都感激地收到了:)
答案 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
中使用expirydate
。 ifnull
需要在null
(expirydate
返回expirydate>curdate()
)中处理null
与已过期expirydate>curdate()
返回0)相同的方式{/ 1}}。if(expirydate>curdate(),expirydate,null) desc
需要按expirydate
降序排序,而不会影响已过期,或null
expirydate
为null
提供相同的排序值id desc
在这种情况下,但它可以是给定数据类型的任何其他有效值。)id
按null
降序排列。影响已过期或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