/ / Zliczanie skojarzeń z wielu tabel - sql, postgresql

Zliczanie skojarzeń z wielu tabel - sql, postgresql

Chcę sprawdzić, ile skojarzeń ma każda z moich rekordów w danej tabeli. Niektóre z tych stowarzyszeń mają pewne warunki związane z nimi

Jak dotąd mam

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

Występuje problem z ostatnią instrukcją dołączeniado rozmów. Chcę policzyć liczbę wątków, które mają co najmniej jedną wiadomość, gdy identyfikator odwiedzającego nie jest pusty. Z jakiegoś powodu otrzymuję wiele rekordów dla każdej aplikacji, tj. rozmowy nie są odpowiednio pogrupowane.

Jakieś pomysły?

Odpowiedzi:

1 dla odpowiedzi № 1

Moje przeczucie, oparte na ograniczonym zrozumieniu wielkiego obrazu: w kwerendzie z zapytaniem wyboru conversations,

  • usunąć DISTINCT
  • usunąć c.id z listy SELECT
  • GROUP BY c.app_id zamiast c.id

EDYCJA: spróbuj tego

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