MySQL排序问题

4
如果我有一个查询,例如:
SELECT * FROM table  WHERE id IN (3,6,1,8,9);

这个id数组是通过PHP动态构建的,而且顺序对我很重要。

$my_array =  array (3,6,1,8,9) ;

如何按照数组中元素出现的顺序对结果进行排序?

可以在MYSQL查询中完成,或者我必须在php中排序后再进行操作?

5个回答

9

您可以通过从列派生的值进行排序。您可以使用 CASE 运算符来指定顺序:

SELECT * FROM table
WHERE id IN (3,6,1,8,9)
ORDER BY CASE id WHEN 3 THEN 1
                 WHEN 6 THEN 2
                 WHEN 1 THEN 3
                 WHEN 8 THEN 4
                 WHEN 9 THEN 5
         END

这就是我想到的答案 - 几年前我遇到了一个需要恰好这个解决方案的边缘情况。 - leepowers

2

我没有测试过,但这个PHP解决方案应该有效:

<?php

$my_array =  array (3,6,1,8,9) ;

$sql = 'SELECT * FROM table  WHERE id IN (3,6,1,8,9)';

$sql .= "\nORDER BY CASE id\n";
foreach($my_array as $k => $v){
    $sql .= 'WHEN ' . $v . ' THEN ' . $k . "\n";
}
$sql .= 'END ';

echo $sql;

?>

这将生成以下SQL代码:
SELECT * FROM table  WHERE id IN (3,6,1,8,9)
ORDER BY CASE id
WHEN 3 THEN 0
WHEN 6 THEN 1
WHEN 1 THEN 2
WHEN 8 THEN 3
WHEN 9 THEN 4
END

1

如果您必须这样做,您将需要在PHP中操作数据。MySQL只能按自然顺序升序或降序排序。

不过我有一个问题 - 为什么您需要以这种非常特定的顺序返回数据?通过重新调整代码中更高层次的某些内容,可能会有更简单的解决方案来解决您的问题。


1
SELECT * FROM table WHERE id IN (3,6,1,8,9) ORDER BY FIELD(id,3,6,1,8,9);

0

您可以将结果加载到一个以ID为索引的数组中:

 while ($row = mysql_fetch_array($l)) $items[$row['id']] = $row;

然后按顺序迭代它即可

 foreach ($my_array as $id) { $current_row = $items[$id]; ... }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接