[转]http://www.php42.com/index.php/database/35-sql/237-mysql-order-by-list
有时以上排序并不能满足我们的需求. 例如, 我们想要按 id 以 5, 3, 7, 1 的顺序排列, 该如何实现. 这也是很多国内外同行经常遇到的问题之一.
下面我们给出按表中某字段, 以我们想要的列表方式排序的解决方案.
解决方案
用"按字段排序" (ORDER BY FIELD).
语法
ORDER BY FIELD(`id`, 5, 3, 7, 1)
要注意的是, FIELD 后面是没有空格的.
因此, 完整的 SQL 为:(补充:先查出这几条数据,再按照规则排序,可加 是desc)
SELECT * FROM `MyTable` WHERE `id` IN (1, 7, 3, 5) ORDER BY FIELD(`id`, 5, 3, 7, 1)
常见应用
SELECT * FROM `MyTable` WHERE `name` IN ('张三', '李四', '王五', '孙六') ORDER BY FIELD(`name`, '李四', '孙六', '张三', '王五')
在yii中写法(第二个条件貌似不满足,需要再研究)
这种情况,就可以用 上 orderBy field !如:
- $orderBy = (new \yii\db\Query())
- ->select('*')
- ->from('product')
- ->orderBy([new \yii\db\Expression('FIELD (id, 3,1,2,4)')])
- ->all();
- if ( in_array(2, $status) ) {
- $query->orderBy(["FIELD(`id`,3,2,1)"=>true, 'g.start_time'=>'asc']);
- } else {
- $query->orderBy(["FIELD(`id`,4,5,6)"=>true, 'g.start_time'=>'desc']);
- }
//自己摸索的
->orderBy(["FIELD(a.status,1,0,3,2)"=>true, 'a.begin_at_plan'=>SORT_DESC]);
yii\helpers\ArrayHelper::multisort($listsArray, ['time'], [SORT_DESC]); $listsArray = array_slice($listsArray, $start, $count);
sql例句:
1 .SELECT * from wx_live_comment_new ORDER BY FIELD(is_show,1,0);
2. SELECT * from wx_live_comment_new ORDER BY FIELD(id,10,11,12) desc;
3.SELECT * FROM wx_live_comment_new WHERE id in(10,11,12) ORDER BY FIELD(id,11,10,12) desc;
扩展sql(比较繁琐,不建议使用)
4 select * from (SELECT * FROM data where prize_code>0 order by prize_code asc) as tmp UNION select * from data where prize_code=0;