我有这样的查询:SELECT * FROM table WHERE id IN (2,4,1,5,3);
然而,当我打印出来时,它会自动排序1,2,3,4,5。如何在不改变数据库结构的情况下维护订单(2,4,1,5,3)?
谢谢!
答案 0 :(得分:56)
SELECT * FROM table WHERE id IN (2,4,1,5,3) ORDER BY FIELD(id,2,4,1,5,3);
来源: http://imthi.com/blog/programming/mysql-order-by-field-custom-field-sorting.php
答案 1 :(得分:20)
我得到的答案和所有信用都属于他们:
您可以使用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;
?>
答案 2 :(得分:6)
(我会把这篇文章写成Michel Tobon的回答,但没有声誉,对不起: - )
“它有效......为什么?打败我,但它只是做了;也尝试了。”
有效的原因是因为你的表达式“code!='USA'”产生一个布尔结果,在SQL中表示为1或0.所以,表达式“code ='USA'产生1表示每个匹配该标准的记录,并且每个记录都不匹配。因为1在升序排序(默认值)中晚于0,匹配记录将比不匹配记录排序。因此否定该表达式产生相反的效果。
产生相同结果的另一种(可能更清晰的)方法如下:
SELECT * FROM countries ORDER BY code='USA' DESC, code='CAN' DESC, name ASC
当然在回答OP的问题时,我最喜欢FIELD()选项 - 非常干净: - )
答案 3 :(得分:2)
Ordering by字段从未对我有用。我有一个国家列表,我需要美国和加拿大出现在列表的顶部,所以我的查询是这样的:
SELECT * FROM countries ORDER BY code='USA', code='CAN', name ASC
这从来没有奏效,但我意识到订单不同,它在列表末尾显示加拿大和各州,所以我这样做了:
SELECT * FROM countries ORDER BY code!='USA', code!='CAN', name ASC
它有效......为什么?打败了我,但它刚刚做到了;试试吧。