MySQL在IN()中的参数后排序

时间:2011-06-09 11:19:18

标签: php mysql

我的字符串包含许多与我的数据库对应的ID。 像:

1,2,3,4,5

然后我执行mySQL查询来选择所有这些行:

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

我希望mySQL按照它们在IN()选择中的顺序返回行。

所以,如果我改为

2,1,3,4,5

在PHP中获取时,我会将#2作为第一行。 没有任何ORDER BY,它看起来像是先返回最低的ID。

如果您需要进一步扩展,请告诉我。

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您可以将order bycase ... end一起使用,但caseend之间的部分应由PHP生成:

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

答案 2 :(得分: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];

答案 3 :(得分: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