Per semplificare la tua logica, aggrega prima, poi unisciti.
Indovinando i dettagli mancanti, questa query ti darebbe il conteggio esatto, quante volte ogni utente è stato referenziato in table1
e table2
rispettivamente per tutti gli utenti :
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);
In particolare, evita che più relazioni 1-n si moltiplichino quando unite insieme:
Per recuperare un uno o pochi utenti solo, LATERAL
i join saranno più veloci (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;
Spiega la differenza percepita
La particolare mancata corrispondenza segnalata è dovuta alle specifiche di un FULL OUTER JOIN
:
Quindi ottieni valori NULL aggiunti sul rispettivo altro lato per le corrispondenze mancanti. count()
non conta i valori NULL. Quindi puoi ottenere un risultato diverso a seconda che filtri su u1.id=100
o u2.id=100
.
Questo è solo per spiegare, non è necessario un FULL JOIN
qui. Usa invece le alternative presentate.