For at forenkle din logik skal du samle først, slutte dig til senere.
Hvis du gætter manglende detaljer, vil denne forespørgsel give dig det nøjagtige antal, hvor mange gange hver bruger blev henvist til i table1
og table2
henholdsvis for alle brugere :
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);
Undgå især, at flere 1-n-relationer multiplicerer hinanden, når de sættes sammen:
For at hente en enkelt eller få brugere kun LATERAL
joins vil være hurtigere (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;
Forklar opfattet forskel
Den særlige uoverensstemmelse, du rapporterer, skyldes detaljerne i en FULL OUTER JOIN
:
Så du får tilføjet NULL-værdier på den respektive anden side for manglende match. count()
tæller ikke NULL-værdier. Så du kan få et andet resultat alt efter om du filtrerer på u1.id=100
eller u2.id=100
.
Dette er bare for at forklare, du behøver ikke en FULL JOIN
her. Brug i stedet de præsenterede alternativer.