Home > Backend Development > PHP Tutorial > 如何优化查询逻辑?

如何优化查询逻辑?

WBOY
Release: 2016-06-06 20:31:17
Original
1289 people have browsed it

看如下代码:

<code>php</code><code>$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');
}
</code>
Copy after login
Copy after login

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

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

回复内容:

看如下代码:

<code>php</code><code>$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');
}
</code>
Copy after login
Copy after login

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

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

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

继续补充

<code>$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'];
    }
}
</code>
Copy after login

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

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template