PHP& Mysql - 嵌套循环

时间:2016-05-11 11:50:07

标签: php mysql

我有2张桌子 - 产品和产品图片。 产品有唯一的ID和标题。 productimages有产品和图像。这些是我的表格的例子:

产品:

|id|title    |
_____________
|1 |Laptop   |
|2 |Speakers |

productimages:

|productid|imageurl|
___________________
|    1    |lap1.png|
|    1    |lap2.png|
|    1    |lap3.png|
|    2    |spe1.png|

现在我在PHP中有一个嵌套循环。 遍历所有行 - > select * from products 并且对于循环内的每个产品 - > select * from productimages where productid = id这基本上是第一个循环中的另一个循环。

然后我将所有productimages带入数组并解码为JSON [标题,照片]。

现在假设你在productimages中有200万行,查询时间太长,有没有办法让它更有效率?

$query = "SELECT * FROM products ORDER BY id LIMIT 10;
$result = mysqli_query($con,$query);

if(mysqli_num_rows($result)>0)
{
    $response = array();
    while($row = mysqli_fetch_assoc($result)) {
        $photos = array();
        $id = $row["id"];
        $title = $row["title"];         

        $queryp = "select imageurl from productimages where productid= '".$id."';";
        $resultp = mysqli_query($con,$queryp);

        if(mysqli_num_rows($resultp)>0)
        {
            while($row2 = mysqli_fetch_assoc($resultp)) {
                $photourl = $row2["imageurl"];
                array_push($photos,$photourl);
            }
        }
     }
  }

3 个答案:

答案 0 :(得分:1)

对你的一些改善可能是:

1)不要使用select *。请改用列名。例如select products.id, products.title, productimages.imageurl

2)使用JOIN代替嵌套循环

因此,您可以尝试查询以下数据:

select products.id, products.title, productimages.imageurl
from products
join productimages on products.id = productimages.productid
ORDER BY products.id LIMIT 10

答案 1 :(得分:0)

这种情况并不罕见 - 你有一对多关系中的两个表。

如果你可以避免SQL调用,那么你永远不应该在循环中嵌套SQL调用,但是决定对一个或两个SQL调用做出决定。

单个SQL调用可以是:

SELECT id, title, imageURL
  FROM products LEFT JOIN productImages ON id=productid

这样做的缺点是你为每种产品多次提取标题,这很浪费。

使用两个SQL语句,您可以为每个产品下载一次标题:

SELECT id, title FROM products

此查询的结果可以存储在关联数组中 - 这样您就可以查找每个ID的标题。

第二个查询是:

SELECT productid, imageURL FROM productImages ORDER BY productid, imageURL

您可以循环查看此查询的结果,随时吐出标题。

答案 2 :(得分:0)

要使用产品保存图片,您可以在产品表格中添加 imageurl 列。使用,收集图片名称并插入该图像名称字符串为产品表。 你的桌子如下所示。

 +--------------+--------------+---------------------------+
 |     id       |    title     | imageurl                  |
 +--------------+--------------+---------------------------+
 |      1       |  Laptop      | lap1.png,lap2.png,lap3.png|
 +--------------+--------------+---------------------------+
 |      2       |  Speakers    | spe1.png                  |

希望你理解我的解释。