[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: можно ли оптимизировать запрос
maximka787
Привет ребят. Скажите можно ли оптимизировать запрос (сделать одним запросом вывод), а не создавать запрос в цикле.
Есть товары, и есть таблица с картинками. У одного товара может быть сколько угодно картинок.
Сейчас я реализую вот так:
$result = mysql_query("select * from catalog");
while($row = mysql_fetch_array($result)){

$id = $row['id']; //получили текущий ID

$resultP = mysql_query("select * from pics where id_product = $id");
while($rowP = mysql_fetch_array($resultP)){
echo '<p><img src="'.$rowP['link'].'"></p>';
}
}

Говорят, правильней сделать одним запросом, а не насиловать сервер.



Спустя 4 минуты, 22 секунды (26.04.2011 - 11:38) alex12060 написал(а):
Вложенный запрос. Или JOIN

Спустя 2 минуты, 2 секунды (26.04.2011 - 11:40) Nikitian написал(а):
Лучше в 2 запроса:

$result = mysql_query("select * from catalog");
$ids=array();
while($row = mysql_fetch_array($result)){
$id = $row['id']; //получили текущий ID
$ids[]=$id;
}
$resultP = mysql_query("select * from pics where id_product in ('".implode('","',$id)."')");
while($rowP = mysql_fetch_array($resultP)){
echo '<p><img src="'.$rowP['link'].'"></p>';
}

Хотя если кроме самих картинок никаких данных не требуется, то можно и так:

$resultP = mysql_query("select * from pics where id_product in (select id from catalog)");
while($rowP = mysql_fetch_array($resultP)){
echo '<p><img src="'.$rowP['link'].'"></p>';
}

Спустя 8 секунд (26.04.2011 - 11:41) Игорь_Vasinsky написал(а):
действительно - 100 строк - 100 запросов....

могу посоветовать переделать таблицу:

table `catalog`

id | goods
// id и название товара


table `pics`

id | nameFile | goods_id

//id , имя картинки (может и вместе с путём), id - товара к которому пренадлежит картинка

Спустя 10 минут, 12 секунд (26.04.2011 - 11:51) linker написал(а):
Судя по примеру, здесь имхо единственно верный вариант
SELECT * FROM `pics` ORDER BY `id_product` ASC
:D

Спустя 2 минуты, 22 секунды (26.04.2011 - 11:53) Nikitian написал(а):
Цитата (linker @ 26.04.2011 - 11:51)
Судя по примеру, здесь имхо единственно верный вариант
SELECT * FROM `pics` ORDER BY `id_product` ASC
:D

Не факт, что в пиксах только из каталога картинки описаны. Я часто делаю общую таблицу под все загружаемые файлы, независимо от их принадлежности к какому-либо модулю.

Спустя 9 минут, 1 секунда (26.04.2011 - 12:02) maximka787 написал(а):
alex12060
ну да, это верно, только я не делал пока так)

Цитата
могу посоветовать переделать таблицу:
не тут однозначно структура верная. К тому же ты тоже самое и написал если я не ошибаюсь.

Nikitian Да мне надо выводить данные из 2х таблиц, не только картинки. Первый вариант наворочен на мой взгляд но суть думаю верная.

Спустя 4 минуты, 56 секунд (26.04.2011 - 12:07) linker написал(а):
Ну я не зря улыбался smile.gif

Спустя 11 минут, 24 секунды (26.04.2011 - 12:18) Nikitian написал(а):
Если уж совсем в педагогику удариться. то так

$result = mysql_query("select * from catalog");
$data=array();
if(is_resource($result) && mysql_num_rows($result)>0){
while($row = mysql_fetch_assoc($result)){
$data[mysql_escape_string($id)]=$row;
}
}

if(sizeof($data)>0){
$result = mysql_query("select `link`,`id_product` from pics where id_product in ('".implode('","',array_keys($data)."')");
if(is_resource($result) && mysql_num_rows($result)>0){
while($row = mysql_fetch_assoc($result)){
$data[$rowP['id_product']]['pics'][]=$row['link'];
}
}
}


//Вывод
if(sizeof($data)>0){
foreach($data as $item){
//Здесь выводим данные о товаре из $item
.....
if(is_array($item['pics']) && sizeof($item['pics'])>0){
foreach($item['pics'] as $pic){
echo '<p><img src="'.$pic.'"></p>';
}
}
}
}


Спустя 2 минуты, 51 секунда (26.04.2011 - 12:21) maximka787 написал(а):
linker
почему, глупая структура?
id, name .....;  //товары
id, id_product, link // таблица картинок

id_product и id из первой таблицы связь

Спустя 9 минут, 19 секунд (26.04.2011 - 12:31) linker написал(а):
Я бы пошёл старым дедовским способом (раз нет дополнительных условий)
$query = "SELECT `catalog`.`*`, `pics`.`link` FROM `catalog` "
. "LEFT JOIN `pics` ON `pics`.`product_id` = `catalog`.`id` ";
$last_product = -1;
$result = mysql_query($query);
while($row = mysql_fetch_array($result))
{
if ($last_product != $row['id'])
{
$last_product = $row['id'];
echo "Каталог : " . $row['name'];
}
echo '<p><img src="'.$rowP['link'].'"></p>';
}

maximka787
Да я не про то.

Спустя 3 минуты, 29 секунд (26.04.2011 - 12:34) maximka787 написал(а):
Спасибо всем, попробую.

Спустя 3 часа, 18 минут, 39 секунд (26.04.2011 - 15:53) inpost написал(а):
maximka787
SELECT b.*
FROM catalog a
LEFT JOIN pics b ON b.id_product = a.id
GROUP BY a.`id`

Спустя 18 минут, 59 секунд (26.04.2011 - 16:12) Nikitian написал(а):
Цитата (inpost @ 26.04.2011 - 15:53)
maximka787
SELECT b.*
FROM catalog a
LEFT JOIN pics b ON b.id_product = a.id
GROUP BY a.`id`

Не проканает:
Цитата
У одного товара может быть сколько угодно картинок

Спустя 17 минут, 48 секунд (26.04.2011 - 16:30) inpost написал(а):
Nikitian
Подправил

maximka787
SELECT a.`id` as `a.id`,b.*
FROM catalog a
LEFT JOIN pics b ON b.id_product = a.id
ORDER BY `id`

Получишь список типо: продукт 1-картинка1, продукт-1-картинка-2, в условии добавишь проверку, что если a.id повторилась, то картинка для этого продукта, если нет - то уже для следующего, где id продукта = a.id


_____________
..Работает - не трогай!
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.