登录  /  注册
如何优化查询逻辑?
php中文网
发布: 2016-06-06 20:31:17
原创
836人浏览过

看如下代码:

php$bankroll = $this->sgoods_bankroll->order('sb_id desc')->limit(50)->select();
foreach ($bankroll as $k=>&$v) {
    $sl_id = $this->bankrollpop_relations->where(array('br_sb_id'=>$v['sb_id']))->getField('br_sl_id');
    $v['dang_name'] = $this->settlementpop_list->where(array('sl_id'=>$sl_id))->getField('sl_schedule_name');
}
登录后复制
登录后复制

首先查询一个列表,然后foreach这个列表每条记录,再执行两次查询,一次去relations关联表找另一个表的关联字段,一次根据这个关联字段查询表另一个字段。

如果每次foreach查两次数据库的话,那整个下来不是查几百次数据库,这样是不是效率很低,一般这种情况可以怎么优化查询逻辑?

回复内容:

看如下代码:

php$bankroll = $this->sgoods_bankroll->order('sb_id desc')->limit(50)->select();
foreach ($bankroll as $k=>&$v) {
    $sl_id = $this->bankrollpop_relations->where(array('br_sb_id'=>$v['sb_id']))->getField('br_sl_id');
    $v['dang_name'] = $this->settlementpop_list->where(array('sl_id'=>$sl_id))->getField('sl_schedule_name');
}
登录后复制
登录后复制

首先查询一个列表,然后foreach这个列表每条记录,再执行两次查询,一次去relations关联表找另一个表的关联字段,一次根据这个关联字段查询表另一个字段。

如果每次foreach查两次数据库的话,那整个下来不是查几百次数据库,这样是不是效率很低,一般这种情况可以怎么优化查询逻辑?

有个办法就是先foreach一遍得到所有的ids,去relations表一次查出关联的其他表的id,再根据这些id去查询一次,得到一个数组,再foreach数组拼装数据,细节不好描述,大致过程就是这样,不知道这样好不好。大家开发遇到这类问题怎么优化的?

继续补充

$sb_ids = $this->sgoods_bankroll->order('sb_id desc')->limit(50)->getField('sb_id',true);
$sb_ids = implode(',',$sb_ids);//所有sb_id

$where['br_sb_id'] = array('in',$sb_ids);
$sl_ids_array = $this->bankrollpop_relations->where($where)->getField('br_sb_id,br_sl_id');//sb_id和sl_id关联数组
$sl_ids = implode(',',$sl_ids_array);//所有sl_id

$where['sl_id'] = array('in',$sl_ids);
$sl_list = $this->settlementpop_list->where($where)->getField('sl_id,sl_schedule_name,sl_status');

$bankroll = $this->sgoods_bankroll->order('sb_id desc')->limit(50)->select();
foreach ($bankroll as $k=>&$v) {
    $sl_id = $sl_ids_array[$v['sb_id']];
    if($sl_id){
        $v['sl_schedule_name'] = $sl_list[$sl_id]['sl_schedule_name'];
        $v['sl_status'] = $sl_list[$sl_id]['sl_status'];
    }
}
登录后复制

优化之后提高百倍!正好记录一篇博客:http://www.tantengvip.com/2015/07/relation-mysql/

来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 技术文章
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2023 //m.sbmmt.com/ All Rights Reserved | 苏州跃动光标网络科技有限公司 | 苏ICP备2020058653号-1

 | 本站CDN由 数掘科技 提供

登录PHP中文网,和优秀的人一起学习!
全站2000+教程免费学