mysql按字段顺序排列,最后是NULL值

时间:2014-03-06 09:19:28

标签: php mysql

我在order by by子句中使用FIELD函数时遇到了问题。

我的情况是产品可以有三个类别,用户可以选择首先显示的类别。因此,可以形成三种可能的查询。这些是:

查询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值的行。我需要这些出现在最后。

我尝试在FIELD函数中添加NULL,但这似乎不起作用。

有谁知道我能做到这一点的方法?

感谢您的帮助。

4 个答案:

答案 0 :(得分:21)

你可以:

  1. 首先根据列的值NULL然后显式排序:

    ORDER BY product_condition IS NULL, FIELD(...)
    

    这是有效的,因为product_condition IS NULL对于非NULL列为0,对于NULL列为1;并且在(默认)升序中,前者显然会先出现。

  2. 依赖于NULL按降序排序最后并将参数反转为FIELD()的事实:

    ORDER BY FIELD(product_condition, ...) DESC
    

答案 1 :(得分:2)

你应该使用'ORDER BY FIELD desc'来结束显示空值。

答案 2 :(得分:0)

试试这个...

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" );

其他两个相同......

答案 3 :(得分:0)

在最后一个空。 实际表



+------+---------+
| col1 | col2    |
+------+---------+
| 1    | Closed  |
| 2    | Open    |
| 3    | Pending |
| 4    | New     |
| 5    | NULL    |
| 6    | Closed  |
| 7    | New     |
| 8    | NULL    |
+------+---------+

从col2中选择*逐个案例当col2 IS为NULL时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 | +------+---------+