2011-06-09 31 views
3

我有一個字符串包含很多與我的數據庫相對應的ID。 像:在IN()參數後面的MySQL排序

1,2,3,4,5 

我然後做一個MySQL查詢選擇所有這些行:

SELECT * FROM `table` WHERE `id` IN (".$myIDs.") 

我希望MySQL在他們在我的順序返回行()選擇。

所以,如果我不是有

2,1,3,4,5 

在PHP中獲取的時候我會#2爲第一行。 沒有任何ORDER BY,它看起來像首先返回最低ID。

讓我知道如果你需要進一步exlpanation。

回答

5

你應該能夠通過FIELD()功能來做到這一點,像這樣:

SELECT * FROM `table` WHERE `id` IN (2,1,3,4,5) ORDER BY FIELD(`id`, 2,1,3,4,5) DESC 

即:

SELECT 
    * 
FROM 
    `table` 
WHERE 
    `id` IN (".$myIDs.") 
ORDER BY 
    FIELD(`id`, ".$myIDs.") DESC 

更多在這個博客帖子:Sorting MySQL rows using column values

+0

這爲我做!非常感謝你! – jack 2011-06-09 11:37:06

+0

@jack不客氣:) – jensgram 2011-06-09 11:41:43

+0

@jack :)(15個字符) – jensgram 2011-06-09 11:55:52

0

您可以使用order bycase ... end,雖然應該由PHP生成caseend之間部分:

select 
    *  
from 
    table 
where 
    id in (2, 1, 3, 4, 5) 
order by 
    case id 
     when 2 then 1 
     when 1 then 2 
     when 3 then 3 
     when 4 then 4 
     when 5 then 5 
    end asc 
0

你想要的find_in_set功能

$list = "1,2,...."; 
$sql = "select * from table where id in($list) order by find_in_set($id, '$list')"; 

另一個(可能更快)的選擇是在php中排序:

$list = array(2, 3, ...); 
$s = implode(',', $list); 
$sth = mysql_query("select * from table where id in($s)"); 

$rows = array(); 
while($r = mysql_fetch_object($sth)) 
    $rows[$r->id] = $r; 

$sorted_rows = array(); 
foreach($list as $id) 
    $sorted_rows[] = $rows[$id]; 
0

另一種選擇,雖然FIELD可能的方式,你的情況去:

SELECT * FROM `table` WHERE `id` IN (2,1,3,4,5) ORDER BY `id` = 2 DESC, `id` = 1 DESC,`id` = 3 DESC, `id` = 4 DESC, `id` = 5 DESC 
+0

但是這需要我知道$ myIDs的長度 - 或者我在PHP中循環並生成SQL? – jack 2011-06-09 11:37:57

+0

是的,你必須遍歷你的數組並建立SQL。 「FIELD」可能是要走的路,只是另闢蹊徑。 – 2011-06-09 11:48:43

+0

好的,謝謝! – jack 2011-06-09 11:49:37