php 循环里面套sql怎么解决
功能要求: 企业列表(展示企业的基本信息,这里只获取了名称、logo、和服务类型), 服务类型说明: 服务类型一共3级,1、2级是必填的,3级是非必填,如果填的话最多3个, 服务类型1、2、3保存在一张表, pid作为关联字段(默认为0) 企业列表数据结构 服务类型1、2级都是唯一的所有查询企业数据时就关联获取到了
array:4 [
0 => array:6 [
"id" => 1
"company_name" => "公司名称1"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 101
"name" => "金融服务"
]
"service_type2" => array:2 [
"id" => 102
"name" => "理财"
]
"service_type3" => "826,827,828"
]
1 => array:6 [
"id" => 2
"company_name" => "公司名称2"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => 0
"service_type2" => 0
"service_type3" => 0
]
2 => array:6 [
"id" => 3
"company_name" => "公司名称3"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 13
"name" => "日用百货"
]
"service_type2" => array:2 [
"id" => 15
"name" => "文具"
]
"service_type3" => "291,292,295"
]
3 => array:6 [
"id" => 4
"company_name" => "公司名称4"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 48
"name" => "信息服务"
]
"service_type2" => array:2 [
"id" => 50
"name" => "操作系统"
]
"service_type3" => "523,524,526"
]
]
问题就是第三级是用逗号隔开保留的数据,关联查不好查,所以需要单独的处理第三级的数据,怎么弄?
//我这里用的是laravel框架,数据库的交互都是封装好的 下面是根据封装的方法处理的查询数据
foreach( $data as $key => &$vo ){
//首先将第三级的数据整理成一个一维数组
$service_type3 = explode( ',' , $vo['service_type3'] );
$arr_option3['whereIn'] = ['id' => $service_type3]; //whereIn查询指定的数据
$arr_option3['field'] = ['id','name']; //只获取指定的字段信息
$vo['service_type3'] = CompanyServiceTypeRepository::getAll( $arr_option3 ); //查询数据
}
这是执行上面代码数据的结果
array:4 [
0 => array:6 [
"id" => 1
"company_name" => "公司名称1"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 101
"name" => "金融服务"
]
"service_type2" => array:2 [
"id" => 102
"name" => "理财"
]
"service_type3" => array:3 [
0 => "外汇"
1 => "基金"
2 => "股票"
]
]
1 => array:6 [
"id" => 2
"company_name" => "公司名称2"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => 0
"service_type2" => 0
"service_type3" => []
]
2 => array:6 [
"id" => 3
"company_name" => "公司名称3"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 13
"name" => "日用百货"
]
"service_type2" => array:2 [
"id" => 15
"name" => "文具"
]
"service_type3" => array:3 [
0 => "桌面用品"
1 => "办公本薄"
2 => "文件装整"
]
]
3 => & array:6 [
"id" => 4
"company_name" => "公司名称4"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 48
"name" => "信息服务"
]
"service_type2" => array:2 [
"id" => 50
"name" => "操作系统"
]
"service_type3" => array:3 [
0 => "虚拟机系统"
1 => "Unix/Linux"
2 => "Windows/dos"
]
]
]
数据结果正确? 是的正确的 也是我想要的数据机构。 但是当时没有考虑明白, 现在只有4条数据,那么就要循环4次去获取第三级分类名称,要是数据是10条?20条? all? 那不就给数据库增加压力了吗,而且如果有好几家公司的第三级数据相同的话,是不是重复执行了相同的sql语句? 这一层面上是不是又造成了资源浪费。
所有称同事没有注意到我个代码 , 立马 马不停蹄的赶紧改掉,怎么改? 先提供一个思路吧在贴代码
我们一点要避免循环里面套sql查询, 这个你会有意想不到的结果。所有我的思路是将所有企业的第三级数据整理成一个数组,统一去查出所有的第三级名称,在循环数组将对应的名称保存到对应的企业下保存起来。
下面我来贴出代码,虽然代码量会比上面foreach查询的量多一些,但是效率和资源浪费上面提升了很多。
使用到的相关php函数,基本上都是常用函数(具体函数说明请自行百度): array_column() 、implode()、explode()、array_values()、asort()、array_unique()、array_shift()
$service_type3 = array_column( $data , 'service_type3'); //这里会得到一个一维数组,元素是上面$data数据的service_type3字段数据
$service_type3 = implode( ',' , $service_type3 ); //将数据切割成字符串 得到的结果是 "826,827,828,0,291,292,295,523,524,526"
$service_type3 = explode(',', $service_type3 ); //再次将上面的字符串切割成数组(很有必要) 得到的又是一个一维数组,和第一步的数据是不一样的
$service_type3 = array_unique( $service_type3 ); //数组去重
//第一种方法 尽可能的使用php定义的函数
asort( $service_type3 ); //将数组内的元素由低到高进行一下排序(也很有必要,因为又可以会有0在里面,由于上面去重了一次,所有经过排序后如果有0元素的话会在第一位)
$service_type3 = array_values( $service_type3 ); //重新定义数组的索引
if( $service_type3[0] == 0 ){ //如果数组的第一个元素是0
array_shift( $service_type3 ); //删除第一个元素
}
//第二种方法
// foreach ( $service_type3 as $key => $vo ){
// if( $vo == 0 ){
// unset( $service_type3[$key] );
// }
// }
最终得到的数据
array:8 [
0 => "826"
1 => "827"
2 => "828"
4 => "291"
5 => "292"
6 => "295"
7 => "523"
8 => "524"
]
接下来我们在查询第三级的类型名称 这里就只用查询一次数据库就能查出所有的第三级类型名称数据了
$arr_option3['whereIn'] = ['id' => $service_type3]; //所有3级的id
$arr_option3['field'] = ['id','name'];
$arr_service_type3 = CompanyServiceTypeRepository::getAll( $arr_option3 ); //获取第三级服务类型名称
$arr_service_type3 = array_column( $arr_service_type3 ,'name' ,'id'); //将数据整理成id为键 name为值的一维键值对数组
得打的结果
array:8 [
828 => "外汇"
827 => "基金"
826 => "股票"
524 => "Unix/Linux"
523 => "Windows/dos"
295 => "桌面用品"
292 => "办公本薄"
291 => "文件装整"
]
最后将数据保存到对应的企业列表中, 可以对比一下与上面循环里面套sql得到的结果是否一样
foreach ( $data as $key => &$vo ){
if( $vo['service_type3'] != 0 ){
$service_type3 = explode( ',' , $vo['service_type3']); //将字符串切割成数组
$vo['service_type3'] = [];
foreach ( $service_type3 as $k => $v ){
$vo['service_type3'][] = $arr_service_type3[$v];
}
}else{
$vo['service_type3'] = [];
}
11 }
最终得到的结果
array:4 [
0 => array:6 [
"id" => 1
"company_name" => "公司名称1"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 101
"name" => "金融服务"
]
"service_type2" => array:2 [
"id" => 102
"name" => "理财"
]
"service_type3" => array:3 [
0 => "股票"
1 => "基金"
2 => "外汇"
]
]
1 => array:6 [
"id" => 2
"company_name" => "公司名称2"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => 0
"service_type2" => 0
"service_type3" => []
]
2 => array:6 [
"id" => 3
"company_name" => "公司名称3"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 13
"name" => "日用百货"
]
"service_type2" => array:2 [
"id" => 15
"name" => "文具"
]
"service_type3" => array:3 [
0 => "文件装整"
1 => "办公本薄"
2 => "桌面用品"
]
]
3 => & array:6 [
"id" => 4
"company_name" => "公司名称4"
"logo" => "men_hu/picture/2020-07/5f07e6df5561f.jpg"
"service_type1" => array:2 [
"id" => 48
"name" => "信息服务"
]
"service_type2" => array:2 [
"id" => 50
"name" => "操作系统"
]
"service_type3" => array:3 [
0 => "Windows/dos"
1 => "Unix/Linux"
2 => "Unix/Linux"
]
]
]
还是那句话 尽量不要在循环里面套sql语句, 我这里应该第三级的数据不是固定的可以无限的添加,所以才整理成数组用whereIn查询了一次, 但是如果服务类型个数有限(100个以内的话), 直接全部多出来,在出来数组(这里我就不仔细说了 懂的自然懂)
说白了就是php处理数组、数据的能了肯定比你查询数据库厉害
php 循环里面套sql怎么解决的更多相关文章
- handlebars,each循环里面套each循环
handlebars可以用each自动进行循环,下面介绍一下each循环里面套循环来着. html代码 !DOCTYPE html> <html> <head> < ...
- uni-app如何解决在for循环里调用异步请求获取数据顺序混乱问题?
总结/朱季谦 先前有一次做uni-app的js接口对接时,遇到过这样的情况,在for循环里,调用一个异步请求时,返回来的值顺序是乱的,因此,在以下的代码里,push到数组里的值,每次的顺序可能都是不一 ...
- 关于hasNextInt判断后无限循环输出else项的解决办法
话不多说,上来就是干! import java.util.Scanner; public class Test_hasNextInt { /** * @param args */ public sta ...
- sql server 小技巧(8) visual studio 2013里使用Sql server compact 4.0及发布问题处理
1. 安装 Microsoft SQL Server Compact 4.0 https://www.microsoft.com/zh-cn/download/confirmation.aspx?i ...
- 【vue】vue使用Element组件时v-for循环里的表单项验证方法
转载至:https://www.jb51.net/article/142750.htm标题描述看起来有些复杂,有vue,Element,又有表单验证,还有v-for循环?是不是有点乱?不过我相信开发中 ...
- js循环里进行回调,引用循环里的变量,发现只是最后值的问题
做项目的时候,栽在一个小地方,是这样的 我有很多个坐标点,我想把这些坐标点都绑定一个事件,当点击了这个坐标点之后,发送一个ajax 请求,将坐标点的id 发出去,等待显示返回的数据 但是实际当中,无论 ...
- Java问题记录——循环里的二次判断与状态更新
Java问题记录——循环里的二次判断与状态更新 摘要:本文主要记录了在循环操作时可能出现的问题. 问题重现 在使用循环结构时,如果使用了定时任务,或者代码会多次调用循环结构,可能会导致有些对象会被循环 ...
- SQL Server解决孤立用户浅析
孤立用户概念 所谓孤立用户即指在服务器实例上未定义或错误定义了其相应 SQL Server 登录名的数据库用户无法登录到实例. 这样的用户被称为此服务器实例上的数据库的"孤立用 ...
- [经验] 新版SkyIAR、Easy Image X在有些PE里不能运行的解决办法
[经验] 新版SkyIAR.Easy Image X在有些PE里不能运行的解决办法 xxwl2008 发表于 2013-1-26 11:58:38 https://www.itsk.com/threa ...
随机推荐
- LVS-DR:实现VIP和RIP不在同一个网络中的集群
目录 LVS-DR:实现VIP和RIP不在同一个网络中集群 1. router上配置ip转发,并测试 2. DR上配置VIP和转发规则 3. RS上配置arp内核参数和VIP 4. 配置HTTP访问 ...
- ThreadLocal面试六连问
转自:码农沉思录 中高级阶段开发者出去面试,应该躲不开ThreadLocal相关问题,本文就常见问题做出一些解答,欢迎留言探讨. ThreadLocal为Java并发提供了一个新的思路, 它用来存储T ...
- 笨办法学习python3练习代码ex20.py 函数和文件
注意,还要在python3,就是ex20.py的同目录里面直接创建一个ex20.txt的文件.里面至少要有三行内容 #函数和文件 #readline:只读取文本文件的一行 #seek(0):将读写位置 ...
- 符合AUTOSAR(AP&CP)的嵌入式系统和软件设计工具
AUTOSAR Builder功能介绍 AUTOSAR Builder 是达索旗下一种基于 Eclipse 的开放性.可扩展工具套件,用于设计和开发符合 AUTOSAR 标准的系统和软件.最新版本20 ...
- phpredis 扩展之操作 Redis,记下来记下来!
phpredis 是 redis 的 php 的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系很有用 $redis = new Redis(); $redis->connect ...
- Python爬虫教程:验证码的爬取和识别详解
今天要给大家介绍的是验证码的爬取和识别,不过只涉及到最简单的图形验证码,也是现在比较常见的一种类型. 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻 ...
- 一切尽在掌控之中:这个Python脚本,让工作自动向你汇报进度!
图源:unsplash 笔者经常编写Python脚本来进行数据处理.数据传输和模型训练.随着数据量和数据复杂性的增加,运行脚本可能需要一些时间.在等待数据处理完成时可以同时做一些其他工作. 很多人学习 ...
- speedtest测速网站测速节点添加流程
一.准备一台服务器: 系统需求:常见Linux系统: 二.服务器入网(确保可以访问互联网): 三.ssh登录到服务器安装speedtest守护程序程序包: 安装和启动,执行以下命令: curl -O ...
- flask-migrate 处理sqlite数据库报错Constraint must have a name 的解决方案
环境:flask+python+sqlite,我想给某个表里某个字段加unique属性 执行 python manage.py db migrate 没报错,执行 python manage.py d ...
- Storcli64 工具操作指南
1.1 介绍 storcli64可对LSIRAID卡基本操作进行管理,本文主要是对LSIRAID卡常使用到的命令进行介绍 1.2 基本语法 获取控制器号:storcli64 /call show al ...