我在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,但这似乎不起作用。
有谁知道我能做到这一点的方法?
感谢您的帮助。
答案 0 :(得分:21)
你可以:
首先根据列的值NULL
和然后显式排序:
ORDER BY product_condition IS NULL, FIELD(...)
这是有效的,因为product_condition IS NULL
对于非NULL
列为0,对于NULL
列为1;并且在(默认)升序中,前者显然会先出现。
依赖于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 | +------+---------+