Tom*_*Tom 33 mysql count left-join
我想添加表示来自其他表的计数的列.
我有3张桌子.
消息
MessageID User Message Topic
1 Tom Hi ball
2 John Hey book
3 Mike Sup book
4 Mike Ok book
Run Code Online (Sandbox Code Playgroud)
话题
Topic Title Category1 Category2
ball Sports Action Hot
book School Study Hot
Run Code Online (Sandbox Code Playgroud)
Stars_Given
starID Topic
1 ball
2 book
3 book
4 book
Run Code Online (Sandbox Code Playgroud)
我想最终得到:
Topic_Review
Topic Title StarCount UserCount MessageCount
ball Sports 1 1 1
book school 3 2 3
Run Code Online (Sandbox Code Playgroud)
所以基本上我想附加3列,其中包含唯一值的计数(每个主题中给出的星号数,在主题中包含消息的唯一用户,以及每个主题中唯一消息的数量).
我希望最终能够过滤类别(在两个列中查看).
另外,我想最终按照我加入的计数排序.例如,我将有一个按升序排序"按星数"排序的按钮,或按降序排序"用户数"等.
我已经尝试过调整其他人的答案,我无法让它正常工作.
Mic*_*son 93
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
Run Code Online (Sandbox Code Playgroud)
或者,您可以在子查询中执行聚合,如果表中有大量数据,这可能会更有效:
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
Run Code Online (Sandbox Code Playgroud)