PHP y Mysql – bucle nested

Tengo 2 mesas – productos y productimages. El producto tiene ID y título únicos. productimages tiene productid y imageurl. Estos son ejemplos de mis tablas:

productos:

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

productimages:

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

Ahora mismo tengo un bucle nested en PHP. recorra todas las filas de -> select * from products y para cada producto dentro del bucle -> select * from productimages where productid = id que es básicamente otro bucle dentro del primer bucle.

y luego tomo todas las productimages en array y decodifiqué a JSON [título, fotos].

Ahora imagine que tiene 2 millones de filas en tiempos de producción, los tiempos de consulta son demasiado altos, ¿hay alguna manera de hacerlo más eficiente?

 $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); } } } } 

Alguna mejora para ti podría ser:

1) No utilice select * . Utilice nombres de columna en su lugar. Por ejemplo, select products.id, products.title, productimages.imageurl

2) Usar JOIN lugar de bucle nested

Por lo tanto, puedes intentar consultar datos como:

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

Este caso no es infrecuente: tiene dos tablas en una relación de uno a muchos.

Nunca debe anidar una llamada de SQL en un bucle si es posible que pueda evitarla, pero se debe tomar una decisión acerca de una o dos llamadas de SQL.

Una sola llamada SQL podría ser:

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

La desventaja de esto es que está extrayendo el título varias veces para cada producto y esto es un desperdicio.

Usando dos sentencias de SQL, puede descargar los títulos una vez para cada producto:

 SELECT id, title FROM products 

Los resultados de esta consulta se pueden almacenar en una matriz asociativa, para que pueda buscar el título de cada ID.

La segunda consulta es:

 SELECT productid, imageURL FROM productImages ORDER BY productid, imageURL 

Puede recorrer los resultados de esta consulta, escupiendo el título a medida que avanza.

Para guardar las imágenes con el producto, puede agregar una columna imageurl en la tabla de productos. Recoja los nombres de las imágenes con e inserte esa cadena de nombre de imagen en la tabla de productos . Su mesa se ve como a continuación.

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

Espero que hayas entendido lo que te explico.