目前我正在我的声明中做一个非常基本的orderderby。

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

这样做的问题是,“position”的NULL条目被视为0。因此,所有位置为NULL的条目都出现在位置为1,2,3,4的条目之前。例如:

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

有没有办法实现以下排序:

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

当前回答

对于DATE列,您可以使用:


取消:

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

空格:

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

其他回答

对于DATE列,您可以使用:


取消:

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

空格:

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

MySQL有一个未记录的语法来最后对空进行排序。在列名前加一个负号(-),并将ASC切换为DESC:

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

它本质上与位置DESC相反,将NULL值放在最后,但在其他方面与位置ASC相同。

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

类似的

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

将999999999替换为该字段的最大值

我发现这在很大程度上是一个很好的解决方案:

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

试着使用这个查询:

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