現在、私はステートメントで非常に基本的なOrderByを行っています。
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.
MySQLには、nullを最後にソートするための文書化されていない構文があります。列名の前にマイナス記号(-)を置き、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
私はこれがほとんどの部分に適したソリューションであることがわかりました。
SELECT * FROM table ORDER BY ISNULL(field), field ASC;
何かのようなもの
SELECT * FROM tablename where visible=1 ORDER BY COALESCE(position, 999999999) ASC, id DESC
999999999をフィールドの最大値に置き換えます
NULL LAST
SELECT * FROM table_name ORDER BY id IS NULL, id ASC
このクエリを使用してみてください。
SELECT * FROM tablename
WHERE visible=1
ORDER BY
CASE WHEN position IS NULL THEN 1 ELSE 0 END ASC,id DESC
NULLのインスタンスを別の値に交換して、最初(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
ORDER BY
ステートメントで coalesce NULLを指定できます。
select * from tablename
where <conditions>
order by
coalesce(position, 0) ASC,
id DESC
NULLを下部でソートする場合は、coalesce(position, 100000)
を試してください。 (2番目の数値を、データベース内の他のposition
のすべてより大きくします。)
SELECT * FROM tablename WHERE visible=1 ORDER BY CASE WHEN `position` = 0 THEN 'a' END , position ASC
DATE
列には、次を使用できます。
最後のNULL:
ORDER BY IFNULL(`myDate`, '9999-12-31') ASC
最後に空白:
ORDER BY IF(`myDate` = '', '9999-12-31', `myDate`) ASC