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