2015-01-15 55 views
0

我有一个表格,包含以下字段。MySql通过商业合作伙伴订购条款

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

我想expirydate过滤行,因为我想先已expirydate远离今日(降序expirydate场的顺序)获得行,如果任何行没有“expirydate”或者它已经按ID字段的降序过期订单。

例如(假设今天== 2015年1月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
select * from `table` order by 
    ifnull(expirydate>curdate(),0) desc, 
    if(expirydate>curdate(),expirydate,null) desc, 
    id desc 
  • ifnull(expirydate>curdate(),0) desc需要将之前过期未过期或nullexpirydateifnull需要治疗nullexpirydateexpirydate>curdate()返回null)与已过期相同的方式(expirydate>curdate()返回0)。
  • if(expirydate>curdate(),expirydate,null) desc需要为了不通过expirydate降序而不会影响过期或nullexpirydate通过提供一种用于订购相同值期满(在这种情况下null,但它可以是对于给定的数据类型的任何其它有效的值)。
  • id desc order by id按降序排列。影响已过期或与nullexpirydate并且未过期与相同expirydate
+0

谢谢:)这个查询工作正常:)我认为'ifnull'和'if'语句做同样的工作。 – indrarajw 2015-01-19 14:33:37

+0

@indrarajw他们做不同的工作。也许'ifnull(expirydate> curdate(),0)desc'冗余在这里。如果将空值视为小于非空值,那么if(expirydate> curdate(),expirydate,null)desc将它们放在列表的底部。但是,例如,如果您想升序排列而不过期,但仍然在过期之前放置它们,则应存在'ifnull(expirydate> curdate(),0)desc'。 – PetSerAl 2015-01-19 15:21:02

0

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

假设你的表名是tbl,则:

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

谢谢你的回答:)这个答案可以帮助我很多来获得我的愿望结果。这是我编辑的查询_“ORDER BY DATEDIFF( IF((expirydate' indrarajw 2015-01-19 14:25:59

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

这个查询稍长一点,但它对我的工作:) thanx – indrarajw 2015-01-19 14:34:35

相关问题