Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Сложный запрос к Mysql
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Сложный запрос к Mysql

Страниц (1): [1]
 

1. MyLittie - 24 Января, 2008 - 06:37:11 - перейти к сообщению
Всем привт! Появилась проблемка, помогите решить.Есть у меня такой код:
CODE (text):
скопировать код в буфер обмена
  1.  
  2.  
  3. $db_res = db_query("SELECT id  FROM  orders  WHERE shop_id = 1 GROUP BY id ");
  4. for($mass_orders = array(); $row = mysql_fetch_assoc($db_res); $mass_orders[] = $row);
  5.                 $sum = 0;
  6.                 $punct = 0;
  7.                 // начало цикла
  8.                 for($i = 0; $i<count($mass_orders); $i++) {
  9.                         $res = $mass_orders[$i]["id"];
  10.                                                 $db_res = db_query("SELECT DISTINCT provider FROM orders_product  WHERE orders_id = ".$res." ORDER BY  provider");
  11.                         $sum = mysql_num_rows($db_res);
  12.                         if ($sum != 0)  $sum = $sum+1;
  13.                         $punct = $punct+$sum;
  14.  

Суть вот в чем.Есть таблица orders с полями id (номер заказа) и shop_id (там есть и др. поля, но нужны именно эти). В первом запросе из таблицы выбираются все номера заказов магазина с номером 1 (есть магазины и с др. номерами)и заносятся в массив. Во втором запросе,из таблицы order_products выбираются все уникальные значения поля provider у записей, у которых orders_id равно id из БД orders, а далее идут некоторые расчеты.В данном случае код полностью рабочий, т.е. выводит те результаты, которые нужно, но есть одно НО...Он очень долго думает (сек. 25 у меня на локалке) и начинает он долго думать на этапе, где начинается цикл. Помогите плз. переделать этот код так, чтобы время раздумий уменьшилось.Возможно можно все это дело уместить в один запрос.
PS Кол-во записей в таблице orders_products около 7 тысяч.
2. EuGen - 24 Января, 2008 - 20:53:04 - перейти к сообщению
Любой DISTINCT-запрос сильно нагружает БД. Это следует помнить. В один запрос, конечно, можно. Но это незначительно ускорит Ваш скрипт.
CODE (text):
скопировать код в буфер обмена
  1.  
  2. $db_res = db_query("SELECT DISTINCT provider FROM orders_product LEFT JOIN orders ON  orders_product.orders_id=orders.id WHERE orders.shop_id=1 ORDER BY orders_product.provider");
  3.  

Это если я правильно понял логику Ваших запросов.
3. MyLittie - 26 Января, 2008 - 10:48:18 - перейти к сообщению
Спасибо за ответ, но к сожалению данный запрос находит количество уникальных provider во всей таблице. А мне нужно приблизительно так: в таблице orders_product берутся все товары, у которых номер (orders_id) заказа равен 1. У каждого товара есть свой поставщик, мы находим всех этих уникальных поставщиков (provider) и запоминаем.Далее берутся товары с номером заказа 2, тоже находится кол-во уникальных поставщиков и суммируется с предыдущим значением, потом берутся товары с номером заказа 3 и т.д. по всей таблице до самого конца. И вот уже эта сумма мне и нужна на выходе. У меня такое ощущение, что тут вообще без цикла, как в моем случае не обойтись.PS Еще вопросик, как сильно DISTINCT тормозит запрос?? Может самому пытаться находить кол-во уникальных поставщиков??
4. EuGen - 28 Января, 2008 - 10:57:04 - перейти к сообщению
Выведите сюда, пожалуйста, структуры таблиц вместе со связями по полям. Так, я думаю, яснее будет.

 

Powered by ExBB FM 1.0 RC1