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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Сложный запрос к Mysql

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Правильный запрос
MyLittie
Отправлено: 24 Января, 2008 - 06:37:11
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




Всем привт! Появилась проблемка, помогите решить.Есть у меня такой код:
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 тысяч.
 
 Top
EuGen Администратор
Отправлено: 24 Января, 2008 - 20:53:04
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Любой 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.  

Это если я правильно понял логику Ваших запросов.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
MyLittie
Отправлено: 26 Января, 2008 - 10:48:18
Post Id


Новичок


Покинул форум
Сообщений всего: 4
Дата рег-ции: Янв. 2008  


Помог: 0 раз(а)




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


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Выведите сюда, пожалуйста, структуры таблиц вместе со связями по полям. Так, я думаю, яснее будет.

(Отредактировано автором: 28 Января, 2008 - 10:57:26)



-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB