2013-11-28 82 views
1

我試圖使用自定義命令,像這樣一個SELECT聲明resutls排序:MySQL的自定義排序順序ORDER BY FIELD()發出

SELECT * FROM table ORDER BY FIELD(id,4,5,6) LIMIT 6 

我期待能與IDS返回的行:4,5,6,1,2,3但相反,我得到1,2,3,7,8,9。我究竟做錯了什麼?

作爲一個方面說明:此前運行該查詢,我從數據庫中使用不同的SELECT拉此排序順序與GROUP_CONCAT功能,像這樣:

SELECT group_concat(clickID ORDER BY count DESC separator ',') from table2 WHERE searchphrase='$searchphrase' 

這將導致4,5,6然後在主查詢中使用它。有沒有更快的方法在一個聲明中寫這一切?

+0

你說你在做一個group_cocnat,所以'id'可能是一個字符串,並且你將它與整數進行比較... –

+0

對不起,'GROUP_CONCAT'在此查詢之前完成並返回'4,5 ,6' 。 ID是'BIGINT' – cronoklee

+0

然後就是你的問題。 'FIELD(id,'4,5,6')'基本上是'id ='4,5,6''。字段()中的第一個參數將針對每個後續參數進行測試。你的csv字符串是一個單一的單一值。您可能需要'find_in_set()'。 –

回答

3

嘗試這種方式

SELECT * 
    FROM table1 
ORDER BY FIELD(id, 4,5,6) > 0 DESC, id 
    LIMIT 6 

輸出:

 
| ID | 
|----| 
| 4 | 
| 5 | 
| 6 | 
| 1 | 
| 2 | 
| 3 | 

這裏是SQLFiddle演示

+0

似乎工作! ...你能解釋一下爲什麼嗎? – cronoklee

+1

這是因爲如果'id'是一組值,否則'FIELD()'返回非零索引,否則爲零。 – peterm

+0

請參閱FIELD()上的''documentation''獲取更多信息:http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_field – nrathaus

1

沒有必要的FIELD功能。這隻會讓事情變得緩慢。

你只需要正確使用ORDER BY

SELECT * FROM table 
ORDER BY id IN (4,5,6) DESC, id 
LIMIT 6 
+1

哇,我喜歡這個。如果IN()執行這項工作,那麼'FIELD()中的點是什麼? – cronoklee

+0

沒有。正如我所提到的那樣,它會讓事情變得不必要的緩慢。 –

1

這裏是如何做到這一切在一個查詢

SELECT DISTINCT t1.* 
FROM table t1 
LEFT JOIN table2 ON t1.id = t2.clickID AND t2.searchphrase='$searchphrase' 
ORDER BY t2.clickID IS NULL ASC, t1.id ASC 

LEFT JOIN沒有找到匹配,它設置字段t2到返回的行中爲NULL。這通過這個無效命令。

+0

非常感謝Barmar – cronoklee