2011-09-05 53 views
1

我喜歡在MySQL上優先選擇一行。我不知道這是否是可能的,但看到下面的例子:MySQL中的優先條件

id name 
1 John 
2 Doe 
3 Mary 
4 Jhonny 

假設我不知道ID,而是通過一個具體的理由,我需要通過優先選擇:3,2,1 ...在這種情況下,MARY將被選中(#3)。但是如果我需要按順序選擇5,2,1,DOE將被選中(#2)。

好的,我可以通過使用IN(5,2,1)。問題是,如果我沒有任何結果(如IN(5,6,7)),我至少需要一行(無所謂)。

例如:選擇5,6,7 ...找不到...然後,選擇第一個找到的(如JOHN)。

有可能嗎?

再見!

編輯:我只是覺得這個解決方案的,但我不知道它應該有多快可以,但效果很好。接受一個有更好基準的迴應,以免失敗。

ORDER BY FIND_IN_SET(`id`, '5,6,7') DESC 
+0

優先級順序可以是類似於「2,4,1,3」併產生Doe的結果嗎?或者'Jhonny'是一個可接受的結果? –

+0

如果不符合優先級,可以使用任何行,以先到者爲準,就是這樣。 –

回答

6
SELECT * 
FROM your_table 
ORDER BY 
(CASE id 
WHEN 5 THEN 1 
WHEN 6 THEN 2 
WHEN 7 THEN 3 
ELSE id+10 
END) 
LIMIT $some_limit; 

的訣竅是利用上order by

所以,5匹配的ID將給予優先考慮1,
的6匹配的ID將給優先級2,
匹配id爲7會給優先級3,
否則,最少id將返回

假設你使用無符號的ID

+0

但是,如果您在列表中沒有任何ID,並且您的$ some_limit是10,您將獲得前10個結果,而不僅僅是他想要的結果。 –

+0

OP至少要一行,所以它仍然會匹配 – ajreal

0

首先,您需要重新映射ID列命令列,讓我們有特殊工會的幫助下做到這一點(第一列是你的ID,第二個是爲了指令):

SELECT 5 as ID, 1 as ord 
UNION ALL SELECT 2 , 2 
UNION ALL SELECT 1 , 3 

是否清楚? 如果是的話 - 讓我們做完整的例子:

SELECT m.* from MyTable m 
    LEFT OUTER JOIN (
     SELECT 5 as ID, 1 as ord 
     UNION ALL SELECT 2 , 2 
     UNION ALL SELECT 1 , 3 
    ) o ON m.ID = o.ID 
ORDER BY COALESCE(o.ord, 100) 
0

SELECT U.username,ID FROM tbluserü ORDER BY FIND_IN_SET(username, '測試')DESC,用戶名ACS

這個優先級(使首先)「測試器」,然後對其進行排序AZ