Mysql упорядочивается по полю с последними значениями NULL
У меня возникла проблема при использовании функции FIELD в моем заказе by.
Моя ситуация - продукт, который может иметь три категории, и пользователь может выбрать, какую категорию показывать в первую очередь. Таким образом, существует три возможных вопроса, которые могут быть сформированы. Это:
Запрос 1
SELECT
*
FROM
my_table
WHERE
main_categories_id = 2
ORDER BY FIELD(product_condition,
'graded',
'new',
'used');
Запрос 2
SELECT
*
FROM
my_table
WHERE
main_categories_id = 2
ORDER BY FIELD(product_condition,
'new',
'graded',
'used');
Запрос 3
SELECT
*
FROM
my_table
WHERE
main_categories_id = 2
ORDER BY FIELD(product_condition,
'used',
'new',
'graded');
Это не работает, когда условие продукта равно NULL, потому что оно всегда показывает строки со значением NULL. Мне нужно, чтобы они появились последними.
Я попытался добавить NULL к функции FIELD, но это, похоже, не работает.
Кто-нибудь знает способ, которым я могу это достичь?
Спасибо за вашу помощь.
Ответы
Ответ 1
Вы можете:
-
Явно сортировать сначала по столбцу NULL
, а затем по его значению:
ORDER BY product_condition IS NULL, FIELD(...)
Это работает, потому что product_condition IS NULL
будет 0 для столбцов не NULL
и 1 для столбцов NULL
; и в порядке возрастания (по умолчанию) первый, очевидно, будет первым.
-
Полагайтесь на то, что NULL
сортируется последним в порядке убывания и отбрасывает аргументы на FIELD()
:
ORDER BY FIELD(product_condition, ...) DESC
Ответ 2
вы должны использовать "ORDER BY FIELD desc" для отображения нулевых значений в конце.
Ответ 3
Попробуйте это...
SELECT * FROM my_table WHERE main_categories_id = 2 ORDER BY CASE WHEN product_condition IS NULL THEN 1 ELSE 0 END,FIELD( product_condition, "graded", "new", "used" );
то же самое для других двух...
Ответ 4
Нуль в последнем.
Фактическая таблица
+------+---------+
| col1 | col2 |
+------+---------+
| 1 | Closed |
| 2 | Open |
| 3 | Pending |
| 4 | New |
| 5 | NULL |
| 6 | Closed |
| 7 | New |
| 8 | NULL |
+------+---------+
выберите * из test2 в порядке, когда col2 IS NULL THEN 1 ELSE 0 END, FIELD (col2, 'New', 'Open', 'Closed', 'Pending');
+------+---------+
| col1 | col2 |
+------+---------+
| 4 | New |
| 7 | New |
| 2 | Open |
| 1 | Closed |
| 6 | Closed |
| 3 | Pending |
| 5 | NULL |
| 8 | NULL |
+------+---------+