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.
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
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