Оптимизация php кода на запросах к mysql

oopros

Новичок
Подскажите, есть кусок кода
Код:
$result=mysql_query("select ID from po_table1");
while($row=mysql_fetch_array($result1))
{

$result2=mysql_query("select name from po_table2 where  id_pole='".$row['ID']."' ");
while($row2=mysql_fetch_array($result2))
{
echo $row2['name'];
}


}

Насколько я понимаю в данном случае вложенные запросы в цикл while это не совсем правильно. Как я понимаю из-за этого может увеличиваться время ответа от сервера и пр.

Подскажите, как данный кусок кода переделать, чтобы он был более эффективным.
Спасибо.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@AnrDaemon, товарищ хотел узнать про IN или подзапросы :confused:
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@antson, может быть и про него, а может быть и нет)
 

oopros

Новичок
@AnrDaemon, товарищ хотел узнать про IN или подзапросы :confused:
ну например мну нужно вывести из одной таблицы Категорию, а потом товары из этой категории и т.д

я так понимаю мне лучше сделать 1 запрос занося все в массим.
А потом второй запрос через IN используя массив категорий? верно?
 

oopros

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

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@oopros, если ты тыкнул на ссылку с id категории, то у тебя будет минимально - два запроса, первый на вывод информации о категории, второй - вывод товаров этой самой категории

Код:
SELECT * FROM category WHERE id=?
Код:
SELECT * FROM categories_items WHERE category_id=?
И у тебя будет соответствие между category.id = categories_items.category_id
 

oopros

Новичок
@oopros, если ты тыкнул на ссылку с id категории, то у тебя будет минимально - два запроса, первый на вывод информации о категории, второй - вывод товаров этой самой категории

Код:
SELECT * FROM category WHERE id=?
Код:
SELECT * FROM categories_items WHERE category_id=?
И у тебя будет соответствие между category.id = categories_items.category_id
тут да - вопросов нету, но вопрос в том если 10 категорий и по 100 товаров в каждой и нужно все вывести например на 1 страницу?
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@oopros, сначала реши как отбирать категории, первые 10, последние 20, или случайные пять штук. После реши как их этих N категорий отобрать товары, случайные или все такие первые 5-10, или самые популярные?

Вот как только решишь что ты хочешь сделать, там будет видно решение.

И, да, в любом случае такая страница нахрен не нужна, где будет 1000 товаров на странице. Ты вообще где такое видел?
 

oopros

Новичок
ну вот у меня было так: 10 товаров и для каждого из них делался запрос цены из другой таблицы. Способом как в первом посте.
Соответственно получалось 1 запрос получает все товары и + 10 запросов получают цены. Я так понимаю это не правильно. Т.к. время ответа от сервера сразу увеличивается с 30-40мс на 150-200 мс.
я переделал 1 запрос - загоняю в массив, 2 запрос получаю цены, используя в запросе IN куда вывожу массив. В таком случае время ответа от сервера получилось 30-40мс.
Соответственно я так понимаю что случай с массивом более верный?т.к. получается всего 2 запроса.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@oopros, не всегда меньшее число запросов означает правильное решение. В твоей ситуации да - решение верное, можно было бы еще использовать JOIN, чтобы сделать вообще 1 запрос.
 

oopros

Новичок
@oopros, не всегда меньшее число запросов означает правильное решение. В твоей ситуации да - решение верное, можно было бы еще использовать JOIN, чтобы сделать вообще 1 запрос.
а почему так время ответа от сервера увеличивается. Всего 11 запросов - это ж не 100. и каждый запрос получает всего 1 поле, кроме первого.
 

Фанат

oncle terrible
Команда форума
но вопрос в том если 10 категорий и по 100 товаров в каждой и нужно все вывести например на 1 страницу?
Здесь нужен джойн.
Выбираешь все из таблицы товаров и джойнишь к ней таблицу категорий, чтобы получить название категории
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
@oopros, мы же не знаем, что у тебя там за 11 запросов, может там индексов нет :confused:
 

oopros

Новичок
вот реальный пример который был:
Код:
$result1=mysql_query("select url,ID from table1 where active='1'");
while($row1=mysql_fetch_array($result1))
{

$result2=mysql_query("select price from table2  id_prev='".$row1['ID']."' ");
while($row2=mysql_fetch_array($result2))
{

}
}
id_prev - насколько я понимаю это есть индекс
по итогу время ответа от сервера в таком случае увеличивалось в 3-4 раза.
 
Последнее редактирование:
Сверху