PHP内部循环查询

时间:2017-11-29 05:37:42

标签: php sql performance

可以对数据库运行多少个查询。

  • 我在for循环中运行简单的sql查询。估计在循环内运行的队列是否为2000.
  • 这会影响我的表现吗?如果它确实那么延伸到哪个。

表A

code     name
1        abc
2        xyz
4        lol
6        lll
     

表B

code      year    no
1         1990    406
6         2016    510
2         2017    777
6         2017    511
2         2016    777

我想在表格中显示数据:

Name  1990  1991  1992  .............2017
abc    1      0     0                  0
xyz    0      0     0                  1

1 个答案:

答案 0 :(得分:0)

  

这会影响我的表现吗?如果它确实如此,那么。

是。很难说使用2000查询会在多大程度上影响性能。但与执行1,2,20,200个查询相比,它显然效果不佳。

如果您不知道自己正在运行什么样的查询,使用过的PHP循环,也没有更完整的数据集,那么很难再为您提供建议。

话虽这么说,使用2000个查询(每年一个和代码)是荒谬的,并且肯定可以优化。因此,我写了以下内容:

此查询假定table_b中给定codeyear可能有多个条目,因此使用group bysum结合这些结果。

SELECT a.name, b.year, SUM(b.no) AS number
FROM table_a a
INNER JOIN table_b b ON (a.code = b.code)
GROUP BY a.code, b.year
ORDER BY b.year ASC, a.name ASC 

此查询的输出应为:

name      year      number
--------------------------
abc       1990      406
lll       2016      510
xyz       2016      777
lll       2017      511
xyz       2017      777

如果您要使用循环重构数据,例如以下内容(尽管可以通过forforeachwhile循环完成,那么您将创建以下数据结构。

$data = array_reduce($results, function ($data, $result) {
    extract('result');
    $data[$name][$year] = $number;

    return $data;
}, []);

/*
$data = [
    'abc' => [
        1990 => 406,
    ],
    'lll' => [
        2016 => 510,
        2017 => 511,
    ],
    'xyz' => [
        2016 => 777,
        2017 => 777,
    ],
];
*/

通过这种方式,您可以轻松地迭代数据结构,从而根据您的问题生成表格布局。

如果您使用目前正在使用的代码更新问题,我很可能会进一步完善此答案。