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 :: Версия для печати :: несколько COUNT и JOIN
Форумы портала PHP.SU » » Работа с СУБД » несколько COUNT и JOIN

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

1. Hawkmoth - 09 Февраля, 2014 - 11:58:42 - перейти к сообщению
Добрый день, уважаемые форумчане!
Есть две таблицы: одна с товарами (`goods`):
| id | name | price |
другая с перечнем продаж (`sales`):
| id | good | date | status | ,
в которой `good` - это id товара, `date` - дата продажи, `status` - метка отгрузки (1 или 0).

Мне нужно выбрать все товары до определенной цены и подсчитать для каждого товара кол-во продаж и кол-во продаж с завершенной отгрузкой.

Сначала я написал такой запрос:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `g`.`name`, `g`.`price`, COUNT (`s`.`id`), COUNT(`t`.`id`) FROM `goods` g JOIN `sales` s ON `g`.`id`=`s`.`goods` JOIN `sales` t ON `s`.`goods`=`t`.`goods` AND `t`.`status`=1 WHERE `g`.`price`<100 ORDER BY `g`.`id`

но COUNT'ы в этом случае перемножаются. Исправил на это:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `g`.`name`, `g`.`price`, COUNT (DISTINCT `s`.`id`), COUNT(DISTINCT `t`.`id`) FROM `goods` g JOIN `sales` s ON `g`.`id`=`s`.`goods` JOIN `sales` t ON `s`.`goods`=`t`.`goods` AND `t`.`status`=1 WHERE `g`.`price`<100 ORDER BY `g`.`id`

заметил, что вываливается только одна строчка, а остальные игнорируются. Может, кто-то подскажет рабочее решение?
2. KingStar - 09 Февраля, 2014 - 12:04:19 - перейти к сообщению
DISTINCT исключает повторяющиеся значение полей, по моему нужно использовать SUM (`s`.`id`) и т.д.
3. Hawkmoth - 09 Февраля, 2014 - 12:09:51 - перейти к сообщению
Причем здесь SUM? Зачем мне сумма всех значений id? Проблема в том, что мой криворукий запрос выдает только одну строчку, а остальные товары тупо игнорирует. Возможно, вместо JOIN'а здесь рациональнее использовать подзапрос, но я никак не могу допетрить, как его составить.
(Добавление)
Вот такой запрос вроде работает:
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `g`.`id`,`g`.`name`,`g`.`price`,COUNT(DISTINCT `s`.`id`),COUNT(DISTINCT `t`.`id`) FROM `goods` g LEFT JOIN `sales` s ON `g`.`id`=`s`.`good` LEFT JOIN `sales` t ON `s`.`good`=`t`.`good` AND `t`.`status`=1 WHERE `g`.`price`<100 GROUP BY `g`.`id` ORDER BY `g`.`id`

но я не уверен, что правильно.
Может, у кого-то есть более изящное решение?
(Добавление)
Сделал подзапросами
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT `g`.`id`,`g`.`name`,`g`.`price`,(SELECT COUNT(`id`) FROM `sales` WHERE `good`=`g`.`id`) AS `all_sales`, (SELECT COUNT(`id`) FROM `sales` WHERE `good`=`g`.`id` AND `status`=1) AS `complete_sales` WHERE `g`.`price`<100 ORDER BY `g`.`id`
4. Champion - 09 Февраля, 2014 - 16:05:55 - перейти к сообщению
Hawkmoth, group by же
KingStar пишет:
моему нужно использовать SUM (`s`.`id`)
Мне чуть доктор не понадобился. Не говорите так больше
5. KingStar - 09 Февраля, 2014 - 18:04:51 - перейти к сообщению
Champion, не понял Хм
(Добавление)
в плане логики - ну да, затупил Смущение больше не буду Подмигивание
6. tuareg - 09 Февраля, 2014 - 18:37:03 - перейти к сообщению
Как-то так.
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT `g`.`name`, `g`.`price`,
  3. COUNT (`s`.`id`)  AS sales,
  4. SUM(IF(`s`.`status`=1 , 1, 0)) AS shipped
  5. FROM `goods` g
  6. INNER JOIN `sales` s ON `g`.`id`=`s`.`goods`
  7. WHERE `g`.`price`<100 GROUP BY `g`.id ORDER BY `g`.`id`
  8.  

Поиграйтесь, второй join `sales` тут не нужен 100%

 

Powered by ExBB FM 1.0 RC1