我有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);
}
}
}
}
答案 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 |
希望你理解我的解释。