2013-12-24 4 views
3

У меня есть три типа таблиц, сообщение и идеи.Сумма MySQL, счет с группой по и присоединяется

  • Виды таблицы содержат типы сообщений.
  • стол для сообщений содержит сообщение, которое было создано.
  • В таблице проницательности содержится информация о публикации на ежедневной основе.

Вот ссылка на мою скрипту sql SQL Fiddle.

Теперь я хочу сгенерировать отчет, который содержит количество сообщений против каждого типа и сумму их комментариев и комментариев, т. Е. Тип | COUNT (post_id) | SUM (любит) | SUM (комментарии).

Это мои попытки:

select type_name, count(p.post_id), sum(likes), sum(comments) 
from types t 
left join posts p on t.type_id = p.post_type 
left join insights i on p.post_id = i.post_id 
group by type_name; 

Результат: Итоговые значения не верны.

select type_name, count(p.post_id), p.post_id, 
    (select sum(likes) from insights where post_id = p.post_id) as likes, 
    (select sum(comments)from insights where post_id = p.post_id) as comments 
from types t 
left join posts p on t.type_id = p.post_type 
group by type_name; 

Результат: Показывает сумму симпатиях и комментарии только один пост.

+0

Использование 'inner join' с отличным' count' не является опцией? http://sqlfiddle.com/#!2/89688/17 –

+0

Совокупные значения неверны. Сумма комментариев и комментариев составляет 63 и 28 для сообщения типа ссылки. –

+0

Хм. Я посчитал их, и я думаю, что они верны !? –

ответ

3

Ваша первая попытка была реальной. Но каждый post_id был умножается на количество матчей в insights, так что вам нужно использовать DISTINCT:

select type_name, count(distinct p.post_id), sum(likes), sum(comments) 
from types t 
left join posts p on t.type_id = p.post_type 
left join insights i on p.post_id = i.post_id 
group by type_name; 

В качестве альтернативы, вы можете сгруппировать с подзапроса, который сочетает в себе все идеи для одной и той же должности:

select type_name, count(*), sum(likes), sum(comments) 
from types t 
left join posts p on t.type_id = p.post_type 
left join (select post_id, sum(likes) likes, sum(comments) comments 
      from insights 
      group by post_id) i on p.post_id = i.post_id 
group by type_name; 

FIDDLE

+0

Неверные значения агрегата. Сумма комментариев и комментариев составляет 63 и 28 для сообщения типа ссылки. –

+0

первый выглядит лучше, я бы не стал вторым, если бы не было чего-то, чего мне не хватает –

+0

@ShayanHusaini, когда я запускаю вашу первую попытку, я получаю 51 и 24, что выглядит правильно, да? –

-1

попробовать этот

SELECT types.type_name, stats.posts, stats.likes, stats.comments 
FROM types 
LEFT JOIN (
select post_type, count(i.post_id) as posts, sum(i.likes) as likes, sum(i.comments) as comments 
from insights i INNER JOIN posts p ON i.post_id = p.post_id 
) as stats 
ON types.type_id = stats.post_type; 
+0

Я думаю, что вам не хватает GROUP BY post_type в подзапросе. – Mihai

+0

Вы пробовали этот запрос? doesnt работает вообще –

+0

Я пробовал, и действительно, он пропускает группу в подзапросе. 'ВЫБОР types.type_name, stats.posts, stats.likes, stats.comments ИЗ типов LEFT JOIN ( выберите post_type, граф (i.post_id) в должности, суммы (i.likes) как Понравилось, сумма (я.комментарии) в качестве комментариев от информации i INNER JOIN posts p ON i.post_id = p.post_id 10 group by post_type) как статистика ON types.type_id = stats.post_type; ' – bavo

Смежные вопросы