SQL 我們如果要查找某個欄位是否為某個值的時候,會用 WHERE 去下條件,例如:
SELECT * FROM `table` WHERE `ID`=2
當我們同時要找 `ID`=2, 5, 6, 7, ... 都可以的情況,因為數字不是連續量,用 WHERE 來寫就太醜了:
SELECT * FROM `table` WHERE `ID`=2 OR `ID`=5 OR `ID`=6 OR `ID`=7 OR ...
這時也許 ID 的值可以用 IN 取出,就是所謂的 SUBSELECT,用第2個表table2來取回所需要的ID,也許能解決大部分的問題:
SELECT * FROM `table` WHERE `ID` IN (SELECT `ID` FROM `table2` WHERE ...)
可是總是有情況不美好的時候,也就是無法用 IN 取出我要的 ID,這時如果我們已經能事先知道要查詢哪些 ID,把他用 ',' 組成一個字串,再用 FIND_IN_SET()就能解決這個問題:
SELECT * FROM `table` WHERE FIND_IN_SET(`ID`, '2,5,6,7,8,9,11,21,33,45')
但這樣子是有缺點的:就算你把那字串的順序交換,他取回的資料還是照原本的順序取回
SELECT * FROM `table` WHERE FIND_IN_SET(`ID`, '45,5,6,8,9,11,21,33,2,5')
這時得加上排序的方法,只是這方法稍爛,湊合湊合:
SELECT * FROM `table` WHERE FIND_IN_SET(`ID`, '45,5,6,8,9,11,21,33,2,5') order by FIND_IN_SET(`ID`, '45,5,6,8,9,11,21,33,2,5')
或
SELECT * FROM `table` WHERE FIND_IN_SET(`ID`, '45,5,6,8,9,11,21,33,2,5') order by FIELD(`ID`, 45,5,6,8,9,11,21,33,2,5)
注意field的函式裡面要把每個資料獨立寫
參考資料
[1] https://stackoverflow.com/questions/6297369/order-by-find-in-set-and-then-and-then
編修 2010-01-09 14:21:49