一尘不染

来自多个表的MYSQL左联接COUNTS

mysql

我想添加代表其他表计数的列。

我有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

星星_吉文

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列中附加唯一值的计数(每个主题中给定的星数,在主题中具有消息的唯一用户以及每个主题中的唯一消息数)。

我希望最终也能够过滤类别(在两列中均可见)。

此外,我最终希望按加入的人数进行排序。例如,我将要有一个按钮,该按钮按升序按“星数”排序,或按降序按“用户数”排序,依此类推。

我尝试调整其他人的答案,但无法正常工作。


阅读 221

收藏
2020-05-17

共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小提琴

或者,您可以在子查询中执行聚合,如果表中有大量数据,这可能会更有效:

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小提琴

2020-05-17