MySQL Orderby一个数字,最后为空

目前我在发言中正在做一个非常基本的OrderBy。

SELECT * FROM tablename WHERE visible=1 ORDER BY position ASC, id DESC 

这个问题是'位置'的NULL条目被视为0.因此,位置为NULL的所有条目都出现在具有1,2,3,4的条目之前。 例如:

 NULL, NULL, NULL, 1, 2, 3, 4 

有没有办法实现下面的命令:

 1, 2, 3, 4, NULL, NULL, NULL. 

MySQL有一个没有文档的语法来最后对null进行sorting。 在列名之前加一个减号( – ),并将ASC切换到DESC:

 SELECT * FROM tablename WHERE visible=1 ORDER BY -position DESC, id DESC 

它基本上是position DESC的倒数,将NULL值放在最后,否则与position ASC相同。

这里有一个很好的参考http://troels.arvin.dk/db/rdbms#select-order_by

我发现这是大部分的一个很好的解决scheme:

 SELECT * FROM table ORDER BY ISNULL(field), field ASC; 

就像是

 SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC 

将999999999replace为该字段的最大值

尝试使用此查询:

 SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC 

您可以在ORDER BY语句中合并您的NULL:

 select * from tablename where <conditions> order by coalesce(position, 0) ASC, id DESC 

如果你想NULL在底部sorting,请尝试coalesce(position, 100000) 。 (使第二个数字大于db中所有其他position的数字)

您可以用不同的值replaceNULL的实例来sorting它们(如0或-1)或最后一个(大数字或字母)…

 SELECT field1, IF(field2 IS NULL, 9999, field2) as ordered_field2 FROM tablename WHERE visible = 1 ORDER BY ordered_field2 ASC, id DESC 

对于DATE列,您可以使用:


NULLS最后:

 ORDER BY IFNULL(`myDate`, '9999-12-31') ASC 

空白最后:

 ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC 
 SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC 

最后一个

 SELECT * FROM table_name ORDER BY id IS NULL, id ASC 

你为什么不直接订购NULLS?

 SELECT * FROM tablename WHERE visible = 1 ORDER BY position ASC NULLS LAST, id DESC