PHP根据规定的ids数据查询出同样顺序的数据

我遇到的需求是固定死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;复制代码

欢迎你们提出更好的方法来解决此问题

相关文章
相关标签/搜索