Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Два запроса сделать одним
 
 автор: Лена   (20.12.2009 в 16:19)   письмо автору
 
 

Есть категории, товар в них, расфасовка товара (1кг,5кг,10кг) и цена за единицу товара.
product - таблица продуктов
category - таблица категорий, связана с таблице продуктов по cat_id
product_price - расфасовка и цена за продукт, связана с product по product_id
Ниже приведено два запроса. Одним я вытягиваю категорию товаров, товар + описание, расфасовку и цену на продукты.
Второй запрос должен получить количество емкостей для определенного товара. Например, продукт хранится в емкостях 0,5л, 1л, 2л - итого количество =3, вот это количество и считает второй запрос. Вопрос: можно ли эти два запроса слепить в один?


<?php
$query 
"
SELECT pr.product_id pid,
pr.product_title ptitle,
pr.product_descr_price pdescr,
pr.popular_product pop,
pp.id pi,
pp.fasovka pfas,
pp.price pprice,
cat.cat_id cid,
cat.cat_name cname
FROM product pr
LEFT JOIN category cat ON pr.cat_id = cat.cat_id
LEFT JOIN product_price pp ON pr.product_id = pp.product_id
WHERE pr.product_id != 49 AND pr.product_id != 50
ORDER BY cid,pid
"
;
for(
$result mysql_query($query),$b null,$i=1;$arr mysql_fetch_assoc($result);$i++) {
$pid $arr['pid'];
$s "SELECT COUNT(fasovka) fcount
FROM product_price
WHERE product_id = " 
$pid " GROUP BY product_id";
$res mysql_query($s);
if(!
$res)exit("Error in" $s mysql_error());
$count mysql_result($res,0);

//дальше идет остальной код
}

?>

  Ответить  
 
 автор: Fractured#   (20.12.2009 в 16:47)   письмо автору
 
   для: Лена   (20.12.2009 в 16:19)
 

Должно быть что-то одно — либо группирока с COUNT(), либо вывод всех ... емкостей. Единственное, можно сократить количество запросов в цикле, т.к. первый запрос может возвращать несколько записей с одним и тем же pid.

>$s = "SELECT COUNT(fasovka) fcount
>FROM product_price
>WHERE product_id = " . $pid . " GROUP BY product_id";

Тут группировка по product_id смысла не имеет. И желательно написать COUNT(*), если fasovka не принимает значения NULL.

  Ответить  
 
 автор: Лена   (20.12.2009 в 23:39)   письмо автору
 
   для: Fractured#   (20.12.2009 в 16:47)
 

>Единственное, можно сократить количество запросов в цикле, т.к. первый запрос может возвращать несколько записей с одним и тем же pid.

Это я проверяю. Если был такой pid, то уже во второй раз его не берем.

>Тут группировка по product_id смысла не имеет.
Почему?

>если fasovka не принимает значения NULL.
fasovka у меня NOT NULL

  Ответить  
 
 автор: Fractured#   (20.12.2009 в 23:50)   письмо автору
 
   для: Лена   (20.12.2009 в 23:39)
 

> Почему?
Потому что в WHERE условие, оставляющее лишь записи с каким-то одним product_id, т.е. заведомо известно, что группа только одна получится.

> fasovka у меня NOT NULL
Тогда будет быстрее (может и не существенно) COUNT(*)

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования