Добавление объединения и счетчика к существующему запросу раздувает выходные данные сумм и счетчика - PullRequest
1 голос
/ 06 декабря 2011

У меня есть этот рабочий запрос, который работает правильно:

select problems.problem_id , problem_title , sum( vote ) as totalVotes 
from problems 
left join problem_votes on 
problems.problem_id = problem_votes.problem_id 
left join problem_categories on 
problems.problem_id = problem_categories.problem_id  
where problem_categories.category_id = 1 GROUP BY problem_title;  

когда я добавляю еще одно объединение в таблицу suggested_solutions и сумму (column_in_suggested_solutions_table), чтобы увидеть, сколько предложенных решений существует для проблемы, запрос выглядит так:

select problems.problem_id , problem_title , sum( vote ) as totalVotes , count(solution_name) from problems 
left join problem_votes on 
problems.problem_id = problem_votes.problem_id 
left join problem_categories on 
problems.problem_id = problem_categories.problem_id  
left join suggested_solutions on
problems.problem_id = suggested_solutions.problem_id
where problem_categories.category_id = 1 GROUP BY problem_title;

Проблема со вторым запросом состоит в том, что, хотя он по-прежнему возвращает то же количество строк, оригинальная функция sum () возвращает завышенное число подсчетов, а функция подсчета для предлагаемых_полюсов также возвращает завышенное число.

Есть идеи, что я здесь не так делаю?

Спасибо!

1 Ответ

3 голосов
/ 06 декабря 2011

Есть несколько suggested_solutions строк для конкретного problem_id, что означает, что строки, суммируемые в исходном запросе, будут раздуты.

Вы можете сделать group by в производной таблице и присоединиться к ней.

SELECT problems.problem_id,
       problem_title,
       SUM(vote) AS totalVotes,
       Solution_Count
FROM   problems
       LEFT JOIN problem_votes
         ON problems.problem_id = problem_votes.problem_id
       LEFT JOIN problem_categories
         ON problems.problem_id = problem_categories.problem_id
       LEFT JOIN (SELECT COUNT(solution_name) AS Solution_Count,
                         problem_id
                  FROM   suggested_solutions
                  GROUP  BY problem_id) ss
         ON problems.problem_id = ss.problem_id
WHERE  problem_categories.category_id = 1
GROUP  BY problem_title;  

Обратите внимание, что ваш WHERE problem_categories.category_id = 1 также преобразует первые LEFT JOIN между problem_votes и problems в INNER JOIN

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...