Подтвердить что ты не робот

MYSQL Left Join COUNTS из нескольких таблиц

Я хочу добавить столбцы, представляющие подсчеты из других таблиц.

У меня 3 таблицы.

Сообщения

MessageID    User      Message      Topic
1            Tom       Hi           ball
2            John      Hey          book
3            Mike      Sup          book
4            Mike      Ok           book

Темы

Topic      Title     Category1    Category2
ball       Sports    Action       Hot
book       School    Study        Hot

Stars_Given

starID     Topic
1          ball
2          book
3          book
4          book

Я хочу в итоге:

Topic_Review

Topic    Title     StarCount    UserCount    MessageCount
ball     Sports    1            1            1
book     school    3            2            3

Итак, в основном я хочу добавить 3 столбца с подсчетом уникальных значений (количество звезд, заданных в каждой теме, уникальных пользователей, которые имеют сообщения в теме, и количество уникальных сообщений в каждой теме).

Я хочу, в конце концов, иметь возможность фильтровать по категориям (смотрите оба столбца).

Кроме того, я хочу, в конечном итоге, отсортировать по подсчетам, к которым я присоединяюсь. Например, у меня будет кнопка, которая сортируется по "количеству звезд" по возрастанию или сортируется по "количеству пользователей" по убыванию и т.д.

Я пробовал адаптировать ответы других людей, и я не могу заставить его работать правильно.

Спасибо!

4b9b3361

Ответ 1

select
  t.Topic,
  t.Title,
  count(distinct s.starID) as StarCount,
  count(distinct m.User) as UserCount,
  count(distinct m.messageID) as MessageCount
from
  Topics t
  left join Messages m ON m.Topic = t.Topic
  left join Stars_Given s ON s.Topic = t.Topic
group by
  t.Topic,
  t.Title

Sql Fiddle

Или вы можете выполнить агрегацию в подзапросах, что, вероятно, будет более эффективным, если в таблицах будет значительная сумма данных:

select
  t.Topic,
  t.Title,
  s.StarCount,
  m.UserCount,
  m.MessageCount
from
  Topics t
  left join (
    select 
      Topic, 
      count(distinct User) as UserCount,
      count(*) as MessageCount
    from Messages
    group by Topic
  ) m ON m.Topic = t.Topic
  left join (
    select
      Topic, 
      count(*) as StarCount
    from Stars_Given 
    group by Topic
  ) s ON s.Topic = t.Topic

Sql Fiddle