我遇到的需求是固定死top10的数据,前端写死能够轻松实现,为了节约维护成本,我打算在利用后台返回给前端数据。前端
可是由于这排名是设置好的,因此要按照规定的顺序遍历出来sql
具体数据为$usIds,在下方有给出,直接whereIn查询出来的结果则是按照id desc返回的,不太符合咱们项目的要求数据库
主要是让数组里id的顺序返回,因此通过如下方法实现了此功能,但并非很完美数组
暂时就想到了这几种,若是后续还有更好的解决方案,此文章还会继续更新bash
小白亲笔,大佬勿喷。函数
公共代码部分优化
$usIds = ['65', '61', '78', '18', '84', '35', '79', '43', '58', '47'];
$newUsSchools = [];复制代码
最不成熟(也就是最菜)的方法ui
将这些id存在一个数组里,而后遍历进行查询,这样对数据库的压力挺大的,耗费时间。spa
foreach ($usIds as $usId) {
$newUsSchools[] = M('School')->find($usId);
}
var_dump($newUsSchools);die;复制代码
在时间上会浪费不少时间code
$usSchools = M('School')->where(['id'=>['in', $usIds]])->field(['id','name'])->select();
foreach ($usIds as $usId) {
foreach ($usSchools as $value) {
if ($usId == $value['id']) {
$newUsSchools[] = $value;
}
}
}
var_dump($newUsSchools);die;复制代码
需PHP版本5.5+以上使用
$usSchools = M('School')->where(['id'=>['in', $usIds]])->field(['id','name'])->select();
$usSchools = array_column($usSchools,null,'id'); //PHP版本5.5+
foreach ($usIds as $usId) {
array_push($newUsSchools, $usSchools[$usId]);
}
var_dump($newUsSchools);die;复制代码
使用原生sql来实现排序 find_in_str
(表很大的状况)这样的sql效率可能会很低,建议查询出来后用代码来排序
MySQL手册中find_in_set函数的语法:
FIND_IN_SET(str,strlist)str 要查询的字符串
strlist 字段名 参数以”,”分隔 如 (1,2,6,8)
查询字段(strlist)中包含(str)的结果,返回结果为null或记录假如字符串str在由N个子链组成的字符串列表strlist 中,则返回值的范围在 1 到 N 之间。 一个字符串列表就是一个由一些被 ‘,’ 符号分开的子链组成的字符串。若是第一个参数是一个常数字符串,而第二个是type SET列,则FIND_IN_SET() 函数被优化,使用比特计算。 若是str不在strlist 或strlist 为空字符串,则返回值为 0 。如任意一个参数为NULL,则返回值为 NULL。这个函数在第一个参数包含一个逗号(‘,’)时将没法正常运行。
$newUsSchools = M('School')->query("SELECT * FROM kona_school WHERE id IN(65,61,78,18,84,35,79,43,58,47) ORDER BY FIND_IN_SET(id,'65,61,78,18,84,35,79,43,58,47')");
var_dump($newUsSchools);die;复制代码