2011-06-09 17 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