2016-06-30 8 views
0

特定のテーブル内の各レコードにいくつの関連付けがあるかを見たいと思います。これらの団体の中には、これまでのところ、私は会話のための声明に参加し、最後に問題に遭遇し複数のテーブルからの関連付けを集計する

-- Count app associations 
SELECT 
distinct a.name, 
COALESCE(v.count, 0) as visitors, 
COALESCE(am.count, 0) AS auto_messages, 
COALESCE(c.count, 0) AS conversations 
FROM apps a 
LEFT JOIN (SELECT app_id, count(*) AS count FROM visitors GROUP BY 1) v ON a.id = v.app_id 
LEFT JOIN (SELECT app_id, count(*) AS count FROM auto_messages GROUP BY 1) am ON a.id = am.app_id 
LEFT JOIN (
    SELECT DISTINCT c.id, app_id, count(c) AS count 
    FROM conversations c LEFT JOIN messages m ON m.conversation_id = c.id 
    WHERE m.visitor_id IS NOT NULL 
    GROUP BY c.id) c ON a.id = c.app_id 
WHERE a.test = false 
ORDER BY visitors DESC; 

を持っているそれら

に取り付けたいくつかの条件があります。私はvisitor_idがnullでない少なくとも1つのメッセージを持つ会話の数を数えたいと思います。何らかの理由で、私は各アプリごとに複数のレコードを取得します。会話は適切にグループ化されていません。

アイデア?

+0

c.idでグループ化されているという事実に関連している可能性があります。 – scaisEdge

+0

違いがあるようです。 – Tarlen

答えて

1

大きな絵の限られた理解に基づいて、私の勘、:conversationsからネストされたクエリの選択で、

  • 代わりc.app_id BY c.id GROUP
  • SELECTリストからの削除 DISTINCT
  • を削除c.idの

編集:試してみる

... 
LEFT JOIN (
    SELECT app_id, count(*) AS count 
    FROM conversations c1 
    WHERE 
    EXISTS (
     SELECT * 
     FROM messages m 
     WHERE m.conversation_id = c1.id and 
      M.visitor_id IS NOT NULL 
    ) 
    GROUP BY c1.app_id) c 
ON a.id = c.app_id 
+0

私にもっと近づいていますが、カウントが報告されているようです会話があまりにも高い – Tarlen

+0

パーフェクト、まさに私が欲しかったのです – Tarlen

関連する問題