PHP中避免使用for循环或foreach循环组装sql语句来执行数据查询的技巧

2016-10-28 PHP 1052

今天在南宁PHP群,有位大神提出一个当天的面试题。

如何优化以下代码,题目如下:

foreach ($lis as $row0){
      foreach ($list as $row ) {
          $array1 = pdo_fetchall('select * from table1 where '.'id='.$row['id'].' and sid='.$row0['sid']);	     
      }
}

当时,我看到这个开始虽然觉得肯定有优化的地方,但是却没有思路。当然,我只是一个菜鸟。

下面给出群内高手优化后的代码:

if($list && $lis){
    $ids = implode(',',array_column($list, 'id'));
    $sids = implode(',',array_column($lis, 'sid'));
    $array1 = pdo_fetchall('select * from table1 where id IN ('.$ids.') and sid IN ('.$sids.')');
}

明白了吧?虽然代码字数没有减少多少,但是分析可以看出,优化后的代码仅需要一次select查询即可得到上面循环两层才能得到的结果。

题目加强版,如何优化以下代码:

foreach ($lis as $row0){
    foreach ($list as $row ) {
        if($row['id']!=1 && $row0['sid']!=5) {
            $array1 = pdo_fetchall('select * from table1 where '.'id='.$row['id'].' and sid='.$row0['sid']);	     
        }
    }
}

增加了两个条件,ID和SID不等于指定值。如上代码,我可能会在implode返回的数组再去操作去掉id=1和sid=5的值。

但是群内还是高手如云啊,请看如下代码:

if($list && $lis){
    $ids = implode(',',array_column($list, 'id'));
    $sids = implode(',',array_column($lis, 'sid'));
    $array1 = pdo_fetchall('select * from table1 where id IN ('.$ids.') and sid IN ('.$sids.') AND id != 1 AND sid != 5');
}

如上代码,只需要在where条件排除这两个id就好,依然是一次查询。

然后,这位高手就说了一句,能一次查询的就不要分多次查询。

0