2014-03-06 31 views
10

我在按順序使用FIELD子句時遇到了問題。mysql按字段順序排列NULL值last

我的情況是一個產品可以有三個類別,用戶可以選擇首先顯示的類別。所以有三種可能的查詢可以形成。它們是:

查詢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功能,但這似乎並沒有工作。

有沒有人知道我可以做到這一點?

感謝您的幫助。

回答

15

您可以:

  1. 列顯式排序首先是NULL然後由它的價值:

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

    這工作,因爲product_condition IS NULL將是0非 - NULL列和1列NULL列;並且以(默認)升序排列,前者顯然會優先。

  2. 依靠事實NULL最後被按降序排序的參數進行排序和反向FIELD()

    ORDER BY FIELD(product_condition, ...) DESC 
    
+0

謝謝你,偉大的工作 –

+0

謝謝!有效 – normalUser

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

同其他兩家...

0

空在最後。 實際表

 


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

SELECT * FROM testing2以便通過當COL2 IS NULL殼體THEN ELSE 1個0 END,FIELD(COL2, '新建', '打開', '關閉', '待處理');


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