2017-08-08 78 views
1

的行我有如下表:SQL:選擇與第一順序匹配特定的ID和特定類型

id name type 
-- ---- ----- 
1 Joe H 
1 Zoe F 
2 Ken F 
2 Ben H 
3 Lime H 
4 Fine F 
5 Lima F 
5 Sima H 

我想首先選擇匹配的行:

id: 5 & type: H 

id: 2 & type: F 

id: 3 & type: H 

並經過他們其餘的由ASC訂購。

所以最終的結果應該是:

id name type 
-- ---- ----- 
5 Sima H 
2 Ken F 
3 Lime H 
1 Joe H 
1 Zoe F 
2 Ben H 
4 Fine F 
5 Lima F 

我只是找不到如何顯示超過一個值排序第一特定行。如果有幫助,我使用PHP和MySqli。

謝謝

+0

這是一個痛苦的在mysql中做,你可能也只是選擇所有的行,使用PHP進行操作,因爲您無論如何都選擇了它們。 – user2914191

+0

你確定在PHP中做更容易嗎? 你能給我一個如何做的例子嗎? – Ido

回答

1

您可以用case語句命令:

select * from table 
order by 
    case 
     when id = 5 and type = 'H' then 0 
     when id = 2 and type = 'F' then 1 
     when id = 3 and type = 'H' then 2 
     else 3 
    end, id, name 
+0

這是最簡單最快速的方法嗎? – Ido

+1

@Ido這是我知道的最簡單的方式,它是正確的。請小心使用'UNION'來獲得特定訂單。雖然大多數情況下你會得到正確的結果,但如果外部查詢不包含'ORDER BY',它實際上不能保證。請參閱「對單個SELECT語句使用ORDER BY意味着行在最終結果中出現的順序,因爲默認情況下UNION會生成無序的一組行。」 https://dev.mysql.com/doc/refman/5.7/en/union.html – FuzzyTree

+0

謝謝!這也是大桌子最快的方式,對吧? – Ido

0

既然你問MySQL,我會給你一個MySQL的答案。

SELECT * FROM 
(SELECT * FROM `table` WHERE id = 5 AND `type` = "H" ORDER BY id ASC) t 
    UNION 
(SELECT * FROM `table` WHERE id = 2 AND `type` = "F" ORDER BY id ASC) 
    UNION 
(SELECT * FROM `table` WHERE id = 3 AND `type` = "H" ORDER BY id ASC) 
    UNION 
(SELECT * FROM `table` ORDER BY id ASC); 

結果

+------+------+------+ 
| id | name | type | 
+------+------+------+ 
| 5 | Sima | H | 
| 2 | Ken | F | 
| 3 | Lime | H | 
| 1 | Joe | H | 
| 1 | Zoe | F | 
| 2 | Ben | H | 
| 4 | Fine | F | 
| 5 | Lima | F | 
+------+------+------+ 
8 rows in set (0.00 sec) 
+0

它不是顯着慢於FuzzyTree的答案,因爲它每次搜索整個表? – Ido

+0

是的。它不會每次搜索整個表,如果你有一個id和類型的索引。速度沒有被指定爲一個問題。我認爲這是一個小的數據集,這就是爲什麼我建議首先使用PHP。如果你有一張巨大的桌子,那麼你的查詢會吃掉你的記憶。 – user2914191