MySQL - wielokrotne użycie COUNT przemnaża wyniki

0

Mam następujące zapytanie SQL

SELECT f.ID, f.itemType,
	SUM(CASE WHEN o.ID THEN 1 ELSE 0 END) AS opened,
	SUM(CASE WHEN d.ID THEN 1 ELSE 0 END) AS down
FROM tabela1 AS f
LEFT JOIN tabela2 AS o ON o.itemID = f.ID
LEFT JOIN tabela3 AS d ON d.itemID = f.ID
WHERE f.itemType = 'letterIn'

Wyjściowe założenie jest takie, żeby pobrać ID i itemType elementu znajdującego się w tabela1 oraz liczbę odwołań do tego elementu z tabela2 i tabela3.
W przypadku gdy liczba wierszy w tabela2 lub/i tabela3 wynosi 0 wszystko działa prawidłowo i zwraca poprawne wyniki np. $row['opened'] = 3 i $row['down'] = 0. Natomiast w przypadku gdy w obu tabelach występuje odniesienie do głównego elementu np. (3. odwołania w 'tabela2' oraz 2 odwołania w 'tabela3') wtedy w wyniku pojawiają się przemnożone wartości przemnożone przez siebie $row['opened'] = 6 i $row['down'] = 6.
Gdzie tkwi błąd?

0
SELECT f.ID, f.itemType,
    Count(distinct o.itemID) AS opened,
    Count(distinct d.itemID) AS down
FROM tabela1 AS f
LEFT JOIN tabela2 AS o ON o.itemID = f.ID
LEFT JOIN tabela3 AS d ON d.itemID = f.ID
WHERE f.itemType = 'letterIn'
0
Marcin.Miga napisał(a):
SELECT f.ID, f.itemType,
    Count(distinct o.itemID) AS opened,
    Count(distinct d.itemID) AS down
FROM tabela1 AS f
LEFT JOIN tabela2 AS o ON o.itemID = f.ID
LEFT JOIN tabela3 AS d ON d.itemID = f.ID
WHERE f.itemType = 'letterIn'

To teraz w przypadku opisywanym w pierwszym poście zamiast $row['opened'] = 6 i $row['down'] = 6 zwraca $row['opened'] = 1 i $row['down'] = 1

1
SELECT f.ID, f.itemType,
    c1 AS opened,
    c2 AS down
FROM tabela1 AS f
LEFT JOIN (SELECT itemID, Count(*)  c1 FROM tabela2 GROUP BY 1) AS o ON o.itemID = f.ID
LEFT JOIN (SELECT itemID, Count(*) c2 FROM tabela3 GROUP BY 1) AS d ON d.itemID = f.ID
WHERE f.itemType = 'letterIn'
0
Marcin.Miga napisał(a):
SELECT f.ID, f.itemType,
    c1 AS opened,
    c2 AS down
FROM tabela1 AS f
LEFT JOIN (SELECT itemID, Count(*)  c1 FROM tabela2 GROUP BY 1) AS o ON o.itemID = f.ID
LEFT JOIN (SELECT itemID, Count(*) c2 FROM tabela3 GROUP BY 1) AS d ON d.itemID = f.ID
WHERE f.itemType = 'letterIn'

Teraz działa wyśmienicie. Dziękuję :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1