Para simplificar su lógica, agregue primero, únase después.
Adivinando detalles faltantes, esta consulta le daría el recuento exacto, cuántas veces se hizo referencia a cada usuario en table1
y table2
respectivamente para todos los usuarios :
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);
En particular, evite múltiples relaciones 1-n que se multipliquen entre sí cuando se unen:
Para recuperar un uno o varios usuarios solo, LATERAL
las uniones serán más rápidas (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;
Explicar la diferencia percibida
La discrepancia particular que informa se debe a los detalles de un FULL OUTER JOIN
:
Por lo tanto, obtiene valores NULL agregados en el otro lado respectivo para las coincidencias faltantes. count()
no cuenta valores NULL. Entonces puede obtener un resultado diferente dependiendo de si filtra en u1.id=100
o u2.id=100
.
Esto es solo para explicar, no necesita un FULL JOIN
aquí. Utilice las alternativas presentadas en su lugar.