我有这样的查询:SELECT * FROM table WHERE id IN (2,4,1,5,3);
MySQL的自定义排序
然而,当我把它打印出来,它的自动排序1,2,3,4,5。我们如何在不改变数据库结构的情况下维护订单(2,4,1,5,3)?
谢谢!
我有这样的查询:SELECT * FROM table WHERE id IN (2,4,1,5,3);
MySQL的自定义排序
然而,当我把它打印出来,它的自动排序1,2,3,4,5。我们如何在不改变数据库结构的情况下维护订单(2,4,1,5,3)?
谢谢!
我想问:
我得到的答案和所有的功劳属于他们是:
可以使用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
in php u can do it like:
<?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;
?>
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
你为我节省了很多时间和编码!谢谢... – 2013-01-02 11:44:03
通过现场的订货,我从来没有做过。我的国家的名单,我需要美国和加拿大出现在列表的顶部,所以我的查询是这样的:
SELECT * FROM countries ORDER BY code='USA', code='CAN', name ASC
这从来没有工作过,但我意识到,排序是不同的,它是显示加拿大和国家在名单的末尾,所以我这样做:
SELECT * FROM countries ORDER BY code!='USA', code!='CAN', name ASC
它的工作......为什么?打败我,但它只是;尝试一下。
(我会写,这个是米歇尔托邦的答案评论,但没有声誉,对不起:-)
“和它的工作......为什么呢?我就不清楚了,但它只是做;尝试一下。“
工作原因是因为你的表达式“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()选项 - 非常干净:-)
解释得很好。 – ChristianLinnell 2013-03-16 22:46:46
感谢:-)(我有足够的声望来评论吧!:-D) – opensourcejunkie 2013-05-20 16:03:20
Lucas Rossini Ferreira的解决方案比这更简单。 – mkataja 2012-08-21 12:24:29
是的,你是对的 – 2012-08-21 13:17:59