web-dev-qa-db-fra.com

MYSQL Left Join COUNTS à partir de plusieurs tables

Je veux ajouter des colonnes qui représentent le nombre d'autres tables.

J'ai 3 tables.

Messages

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

Thèmes

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

Stars_Given

starID     Topic
1          ball
2          book
3          book
4          book

Je veux finir avec:

Topic_Review

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

Donc, fondamentalement, je veux joindre 3 colonnes avec un nombre de valeurs uniques (nombre d'étoiles données dans chaque sujet, utilisateurs uniques qui ont des messages dans le sujet et nombre de messages uniques dans chaque sujet).

Je veux éventuellement pouvoir également filtrer les catégories (regardez dans les deux colonnes).

Aussi, je veux éventuellement trier par les nombres que je rejoins. Exemple, je vais avoir un bouton qui trie par "nombre d'étoiles" par ordre croissant, ou trie par "nombre d'utilisateurs" par ordre décroissant, etc.

J'ai essayé d'adapter les réponses des autres et je n'arrive pas à les faire fonctionner correctement.

31
Tom
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

Violon Sql

Ou, vous pouvez effectuer l'agrégation dans des sous-requêtes, ce qui sera probablement plus efficace si vous avez une quantité substantielle de données dans les tables:

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

Violon Sql

90