För att förenkla din logik, samla först, gå med senare.
Om du gissar saknade detaljer, skulle den här frågan ge dig det exakta antalet, hur många gånger varje användare refererades till i table1
och table2
respektive för alla användare :
SELECT *
FROM users u
LEFT JOIN (
SELECT updated_by_id AS id, count(*) AS t1_ct
FROM table1
GROUP BY 1
) t1 USING (id)
LEFT JOIN (
SELECT updated_by_id AS id, count(*) AS t2_ct
FROM table2
GROUP BY 1
) t2 USING (id);
Undvik särskilt att flera 1-n-relationer multiplicerar varandra när de sammanfogas:
För att hämta en en eller ett fåtal användare endast, LATERAL
anslutningar blir snabbare (Postgres 9.3+):
SELECT *
FROM users u
LEFT JOIN LATERAL (
SELECT count(*) AS t1_ct
FROM table1
WHERE updated_by_id = u.id
) ON true
LEFT JOIN LATERAL (
SELECT count(*) AS t2_ct
FROM table2
WHERE updated_by_id = u.id
) ON true
WHERE u.id = 100;
Förklara upplevd skillnad
Den särskilda missmatchningen du rapporterar beror på detaljerna i en FULL OUTER JOIN
:
Så du får NULL-värden tillagda på respektive andra sida för saknade matchningar. count()
räknar inte NULL-värden. Så du kan få ett annat resultat beroende på om du filtrerar på u1.id=100
eller u2.id=100
.
Detta är bara för att förklara, du behöver ingen FULL JOIN
här. Använd de presenterade alternativen istället.