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 :: Двойной подсчет из одной таблицы через LEFT JOIN

 PHP.SU

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


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

> Без описания
Telnet
Отправлено: 02 Мая, 2017 - 19:04:54
Post Id


Частый гость


Покинул форум
Сообщений всего: 223
Дата рег-ции: Май 2011  


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




Привет Всем.
Столкнулся с проблемой.
Есть таблица комментариев и таблица голосов за или против этих комментариев.
Нужно в одном запросе получить все комментарии а также кол-во положительных и отрицательных голосов.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.
 
 Top
Мелкий Супермодератор
Отправлено: 03 Мая, 2017 - 11:45:41
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


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




Простое и банальное декартово произведение получилось.

Например,
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


-----
PostgreSQL DBA
 
 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