MySQL按IN数组排序

6

我有一个像这样的MySQL脚本:SELECT id, name FROM users WHERE id IN (6,4,34)

在IN(...)数组中的顺序非常重要。是否可以按照给定的顺序获取它们?

4个回答

15

您可以使用MySQL FIELD函数使其更加简洁;

SELECT id, name 
FROM users 
WHERE id IN (6, 4, 34)
ORDER BY FIELD(id, 6, 4, 34);

3

尝试

SELECT id, name FROM users WHERE id IN (6,4,34) order by FIELD(id,6,4,34)

1
您可以在ORDER BY子句中使用任何表达式,包括'CASE':
ORDER BY CASE id 
  WHEN 6 THEN 1 
  WHEN 4 THEN 2 
  WHEN 34 THEN 3 
END ASC

如果您的列表来自应用程序编程层,则可以使用以下方式构建(此处为PHP):
$sortVal = 1;
foreach($ids as $id_val) {
  $cases[] = sprintf('WHEN %i THEN %i', $id_val, $sortVal++);
}
$order_by = 'ORDER BY CASE id ' . implode($cases) . ' END ASC';

然而,我要提到Joachim的答案非常优雅 :-)


谢谢,但我不知道之前的数字。我使用implode(“,”,$array)获取数组。 - friction
@friction,我添加了一些示例代码,展示了如何构建CASE子句。 - Chris Trahey

0
一个基于Chris Trahey回答的完整示例。
$ids = array("table1",  "table2", "table3");
    
$sortVal = 1;
foreach ($ids as $id_val) {
    $cases[] = sprintf("WHEN '%s' THEN %u ", $id_val, $sortVal++);
}    
$order_by = 'ORDER BY CASE `tableName` ' . implode($cases) . ' END ASC';    

$result = mysqli_query( $con, "
        SELECT DISTINCT tableName 
        FROM `table` 
        $order_by");

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