2016-06-30 3 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에서 중첩 된 쿼리 선택에서,

  • DISTINCT
  • GROUP c.app_id에 의해 SELECT 목록에서 c.id를 대신 삭제 의

편집을 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

관련 문제