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 :: Версия для печати :: Двойной подсчет из одной таблицы через LEFT JOIN
Форумы портала PHP.SU » PHP » SQL и Архитектура БД » Двойной подсчет из одной таблицы через LEFT JOIN

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

1. Telnet - 02 Мая, 2017 - 19:04:54 - перейти к сообщению
Привет Всем.
Столкнулся с проблемой.
Есть таблица комментариев и таблица голосов за или против этих комментариев.
Нужно в одном запросе получить все комментарии а также кол-во положительных и отрицательных голосов.http://prntscr[dot]com/f3a6ln

Когда пытаюсь разбить на 2 запроса подсчет голосов первый допустим положительные 2 отрицательные
Примерно так
CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT c.*, COUNT(vd.type) AS down FROM `comments` AS `c`
  3. LEFT JOIN `comment_votes` AS `vu` ON (`vu`.`comment_id` = `c`.`id` AND `vu`.`type` = -1)
  4. WHERE `c`.`product_id` = 4 AND `c`.`state` = 1
  5. GROUP BY c.id
  6. SELECT c.*, , COUNT(vu.type) AS up FROM `comments` AS `c`
  7. LEFT JOIN `comment_votes` AS `vu` ON (`vu`.`comment_id` = `c`.`id` AND `vu`.`type` = 1)
  8. WHERE `c`.`product_id` = 4 AND `c`.`state` = 1
  9. GROUP BY c.id
  10.  

Положительный у comment_id 2 = 3
Отрицательных у comment_id 2 = 4
Считает все правильно , но как только я пытаюсь объединять эти запросы в один, то результаты совсем не правильные

CODE (SQL):
скопировать код в буфер обмена
  1.  
  2. SELECT c.*, COUNT(vd.type) AS down, COUNT(vu.type) AS up FROM `comments` AS `c`
  3. LEFT JOIN `comment_votes` AS `vd` ON (`vd`.`comment_id` = `c`.`id` AND `vd`.`type` = -1)
  4. LEFT JOIN `comment_votes` AS `vu` ON (`vu`.`comment_id` = `c`.`id` AND `vu`.`type` = 1)
  5. WHERE `c`.`product_id` = 4 AND `c`.`state` = 1
  6. GROUP BY c.id
  7.  

этот запрос показывает и положительных и у отрицательных по 12

Я так думаю что это потому что результаты от первой выборки как то умножаются на результаты второй, хотя как и почему это происходит понять не могу я же даю им разные алиасы vd и vu.
2. Мелкий - 03 Мая, 2017 - 11:45:41 - перейти к сообщению
Простое и банальное декартово произведение получилось.

Например,
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT c.*, sum(vd.type = -1) AS down, sum(vd.type = 1) AS up FROM `comments` AS `c`
  2. LEFT JOIN `comment_votes` AS `vd` ON (`vd`.`comment_id` = `c`.`id`)
  3. WHERE `c`.`product_id` = 4 AND `c`.`state` = 1 AND `vd`.`type` IN (-1, 1)
  4. GROUP BY c.id

 

Powered by ExBB FM 1.0 RC1