web-dev-qa-db-ja.com

MYSQLは、複数のテーブルからCOUNTSを左結合します

他のテーブルのカウントを表す列を追加したい。

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

Stars_Given

starID     Topic
1          ball
2          book
3          book
4          book

私は最終的に:

トピックレビュー

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

したがって、基本的に、一意の値のカウント(各トピック内の星の数、トピック内にメッセージを持つ一意のユーザー、および各トピック内の一意のメッセージの数)を含む3つの列を添付します。

最終的にはカテゴリ(両方の列を見てください)でフィルタリングすることもできます。

また、最終的には参加したカウントで並べ替えます。たとえば、昇順で「星の数」でソートするボタン、降順で「ユーザーの数」でソートするボタンなどがあります。

私は他の人の答えを適応させようとしましたが、適切に機能させることができません。

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

または、サブクエリで集計を実行できます。テーブルに大量のデータがある場合は、より効率的です。

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