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

版权声明:版权归qq175023117所有 https://blog.csdn.net/qq175023117/article/details/86644833

我遇到的需求是固定死top10的数据,前端写死可以轻松实现,为了节约维护成本,我打算在利用后台返回给前端数据。

但是因为这排名是设置好的,所以要按照规定的顺序遍历出来

具体数据为$usIds,在下方有给出,直接whereIn查询出来的结果则是按照id desc返回的,不太符合我们项目的要求

主要是让数组里id的顺序返回,所以经过以下方法实现了此功能,但并不是很完美

暂时就想到了这几种,如果后续还有更好的解决方案,此文章还会继续更新

小白亲笔,大佬勿喷。

公共代码部分

$usIds = ['65', '61', '78', '18', '84', '35', '79', '43', '58', '47'];

$newUsSchools = [];

第一种方法:

最不成熟(也就是最菜)的方法

将这些id存在一个数组里,然后遍历进行查询,这样对数据库的压力挺大的,耗费时间。

foreach ($usIds as $usId) {
    $newUsSchools[] = M('School')->find($usId);
}

var_dump($newUsSchools);die;

第二种方法:

在时间上会浪费很多时间

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

欢迎大家提出更好的方法来解决此问题

猜你喜欢

转载自blog.csdn.net/qq175023117/article/details/86644833