mysql按问题排序

时间:2010-01-05 10:25:45

标签: php mysql sql-order-by

如果我有这样的查询:

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

这个id数组是动态构建的, 这个命令对我很重要。

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

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

可以在MYSQL查询中执行此操作, 或者我必须通过PHP后订购?

5 个答案:

答案 0 :(得分:10)

您可以按照从列派生的值进行排序。您可以使用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

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

答案 2 :(得分:1)

如果你必须这样做,你将不得不操纵PHP中的数据。 MySQL只能按自然顺序升序或降序排序。

虽然有疑问 - 为什么你需要以这个非常具体的顺序返回的数据?通过重新编写代码中的内容,可以更轻松地解决您的问题。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

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

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

然后只需按顺序迭代

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