it-swarm.com.de

MYSQL Left Join COUNTS aus mehreren Tabellen

Ich möchte Spalten hinzufügen, die Zählungen aus anderen Tabellen darstellen.

Ich habe 3 Tische.

Nachrichten

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

Themen

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

Stars_Given

starID     Topic
1          ball
2          book
3          book
4          book

Ich möchte am Ende mit:

Topic_Review

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

Im Grunde möchte ich 3 Spalten mit einer Anzahl von eindeutigen Werten anhängen (Anzahl der Sterne in jedem Thema, eindeutige Benutzer, die Nachrichten in einem Thema haben, und Anzahl der eindeutigen Nachrichten in jedem Thema).

Ich möchte irgendwann auch in der Lage sein, nach Kategorien zu filtern (siehe beide Spalten).

Außerdem möchte ich irgendwann nach den Zählungen sortieren, an denen ich teilnehme. Beispiel: Ich habe eine Schaltfläche, die nach "Anzahl der Sterne" in aufsteigender Reihenfolge oder nach "Anzahl der Benutzer" in absteigender Reihenfolge usw. sortiert.

Ich habe versucht, die Antworten anderer anzupassen, und ich kann es nicht richtig zum Laufen bringen.

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

SQL Fiddle

Oder Sie können die Aggregation in Unterabfragen durchführen. Dies ist wahrscheinlich effizienter, wenn Sie eine erhebliche Datenmenge in den Tabellen haben:

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 Fiddle

90