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 столбца с подсчетом уникальных значений (количество звезд, заданных в каждой теме, уникальных пользователей, которые имеют сообщения в теме, и количество уникальных сообщений в каждой теме).
Я хочу, в конце концов, иметь возможность фильтровать по категориям (смотрите оба столбца).
Кроме того, я хочу, в конечном итоге, отсортировать по подсчетам, к которым я присоединяюсь. Например, у меня будет кнопка, которая сортируется по "количеству звезд" по возрастанию или сортируется по "количеству пользователей" по убыванию и т.д.
Я пробовал адаптировать ответы других людей, и я не могу заставить его работать правильно.
Спасибо!
Ответы
Ответ 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
Или вы можете выполнить агрегацию в подзапросах, что, вероятно, будет более эффективным, если в таблицах будет значительная сумма данных:
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