有时候多表连表查询比较麻烦容易出错,效率上也不一定有单表快。我们可以用单表查询来代替连表查询。
单表查询需要用把结果拼接起来。
情形:表A,表B关系 在B表中a_id = A表中id。表A与表B是1对多的关系或者是1对1的关系
$ar =$db->('select * form Awhere 条件 ')
$ar 二维数组
$ids=array_column($ar,'id'); $br=$db->('select * from B where a_id in ('.join(',',$ids).') '); //二维数组算法1:常规思路,用两个数循环判断 foreach($ar as $k=>$v){ foreach($br as $k1=>$v1){ if($v['id']==$v1['a_id']){ $ar[$k]['b_list'][]=$v1; } } }以上这种思路代码逻辑清晰,不过两个foreach循环,感觉不太好。算法2:先把数组$br用一个新数组拼装下,在与数组$ar拼接$cr=[]; foreach($br as $k=>$v){ $cr[$v['a_id']][]=$v; //如果A与B是一对一关系:$cr[$v['a_id']]=$v; }foreach($ar as $k=>$v){ if(isset($cr[$v['id']])){ $ar[$k]['b_list']=$cr[$v['id']]; }else{ $ar[$k]['b_list']=[]; } }这种算法虽然代码多点,却仅仅循环了两次就得到了结果。比算法1更好
【利用数组拼接来代替连表查询】
推荐阅读
- 对GO切片的理解
- 小程序商城网站开发秒杀模块篇
- 盲盒购物网站系统开发建设 第三篇
- Netty核心概念之ChannelHandler&Pipeline&ChannelHandlerContext
- 简单的线程池实现多线程对大文件的读取
- SSH 端口转发与 SOCKS 代理
- Ubuntu16.04/Scala2.11.8安装教程
- 学习PHP中的高精度计时器HRTime扩展
- 使用OpenResty+Lua实现灰度测试(金丝雀)
- 使用源码编译安装PHP扩展