Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
优化PHP函数和SQL查询,从MySQL数据库中提取依赖数据_Php_Mysql_Optimization_Query Optimization - Fatal编程技术网

优化PHP函数和SQL查询,从MySQL数据库中提取依赖数据

优化PHP函数和SQL查询,从MySQL数据库中提取依赖数据,php,mysql,optimization,query-optimization,Php,Mysql,Optimization,Query Optimization,如果我有两个表及其各自的列: 产品类别:id、名称 产品:id、类别\ id、名称 我有以下PHP函数: function getProducts(){…}//返回产品中所有行的数组 函数getProductCategory($category_id){…}//返回产品类别的给定id对应的行 目前,我正在表格中显示所有产品的列表,标题如下: 身份证 类别 名字 其中category是与产品的category_id相对应的类别的名称 目前,我正在使用foreach循环迭代产品,并为每个

如果我有两个表及其各自的列:

  • 产品类别:id、名称
  • 产品:id、类别\ id、名称
我有以下PHP函数:

  • function getProducts(){…}//返回产品中所有行的数组
  • 函数getProductCategory($category_id){…}//返回产品类别的给定id对应的行
目前,我正在表格中显示所有产品的列表,标题如下:

  • 身份证
  • 类别
  • 名字
其中category是与产品的category_id相对应的类别的名称

目前,我正在使用foreach循环迭代产品,并为每个产品调用getProductCategory(…)函数:

<?php
...

$products = getProducts();

foreach ($products as $product) {
    $product_category = getProductCategory($product['category_id']);
    ...
}

...
?>

如果有很多产品有很多重复的查询,这将是对数据库的大量查询


有什么方法可以优化此操作吗?

正如评论中所建议的,我决定通过使用
SQL JOIN
语句来使用即时加载,例如,我将获取所有产品的id,并在我的SQL查询中使用
WHERE id in(…)

<?php
$products = getProducts();
$product_ids = array();

foreach ($products as $product) {
    $product_ids[] = $product->id;
}

$product_categories_data = $db->query('SELECT * FROM products_categories WHERE id IN(?, ?, ?, ..., ?)', $product_ids);
?>


然后对结果执行其余的操作。

您能使用
连接“急切加载”数据吗?@tadman那么这意味着我必须修改
getProducts(){…}
函数,在该函数中,查询还将返回类别信息?大概是这样。如果这是一个定制的ORM,那么你将不得不重新发明更多的轮子。如果它是现有的,我会看看它是如何处理急切加载的。如果你还不太深入,也许你可以切换到一个支持良好的ORM,它可以为你做到这一点,开箱即用。@tadman这都是定制的是,我已经编写了查询数据库的大部分函数。但是你指的是使用预构建框架吗?有很多orm,比如、、等等。它们的复杂程度和使用它们的投入程度各不相同,但首先值得一看的是,切换到这一点是否比继续沿着纯定制的道路更容易。