MySQL 自定义排序

21
我有一个类似这样的查询:SELECT * FROM table WHERE id IN (2,4,1,5,3); 然而,当我将其打印出来时,它会自动排序为1,2,3,4,5。我们如何在不更改数据库结构的情况下保留顺序(2,4,1,5,3)?
谢谢!
4个回答

58

21
我问了这个问题: mysql order by issue 得到的答案及所有相关权利归其所有者:
你可以使用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

在 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;

?>

6
Lucas Rossini Ferreira的解决方案比这个简单得多。 - mkataja

6
我本来想在Michel Tobon的回答下留言,但是我的声望不够,很抱歉 :)
这个方法奏效的原因是因为你的表达式“code!=‘USA’”会产生一个布尔结果,在SQL中表示为1或0。因此,“code=‘USA’”表达式对于每个符合该条件的记录都会生成1,对于每个不符合该条件的记录都会生成0。由于1在升序排序(默认)中比0后面,匹配的记录将排在不匹配的记录之后。因此,取反该表达式会产生相反的效果。
另一种可能更清晰的方法是:
SELECT * FROM countries ORDER BY code='USA' DESC, code='CAN' DESC, name ASC

当然,在回答OP的问题时,我最喜欢的选项是FIELD() - 非常简洁 :-)

谢谢 :-) (我现在有足够的声望来评论了!:-D) - opensourcejunkie

2

按字段排序从未对我起作用。我有一个国家列表,需要将美国和加拿大排在列表的顶部,因此我的查询如下:

SELECT * FROM countries ORDER BY code='USA', code='CAN', name ASC

这个从来没有起作用,但我意识到顺序不同,它将加拿大和美国显示在列表的末尾,所以我做了这个操作:

SELECT * FROM countries ORDER BY code!='USA', code!='CAN', name ASC

它起作用了...为什么?我也不知道,但它确实起作用了;你也可以试一下。


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