mysql自定义排序

Pat*_*ick 18 mysql sorting

我有这样的查询: SELECT * FROM table WHERE id IN (2,4,1,5,3);

但是,当我打印出来时,它会自动排序1,2,3,4,5.如何在不改变数据库结构的情况下维护订单(2,4,1,5,3)?

谢谢!

Luc*_*ini 56

SELECT * FROM table WHERE id IN (2,4,1,5,3) ORDER BY FIELD(id,2,4,1,5,3);
Run Code Online (Sandbox Code Playgroud)

资料来源: http ://imthi.com/blog/programming/mysql-order-by-field-custom-field-sorting.php


Hai*_*vgi 20

我问这个:

mysql按问题排序

我得到的答案和所有信用属于他们是:

您可以使用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
Run Code Online (Sandbox Code Playgroud)

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

?>
Run Code Online (Sandbox Code Playgroud)

  • Lucas Rossini Ferreira的解决方案比这简单得多. (6认同)

ope*_*kie 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
Run Code Online (Sandbox Code Playgroud)

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