Si encuentras algún problema con tu código o proyecto, recuerda probar siempre en un entorno de testing antes aplicar el código al trabajo final.
Solución:
Su segunda consulta está bien. Simplemente agrupe por el usuario de la primera tabla. De lo contrario, convertirías tu left join
en una inner join
SELECT
u.name,
COUNT(rh.uid) AS cnt
FROM
`user` u
LEFT JOIN
user_rh rh
ON (rh.uid = u.uid)
GROUP BY
u.uid, u.name
ORDER BY
u.name
-
no transforma tu unir a la izquierda a una unir internamente. Es solo agrupar por su uid de user_rh cuando está vinculado al usuario. Tiene 3 uid diferentes (NULL, 2 y 1), por eso solo tiene 3 líneas en su resultado.
-
cuando utiliza la cláusula de agrupación, puede seleccionar solo el campo con la agrupación agregada (como COUNT, SUM, AVG…) o el campo disponible en la cláusula de grupo. Puede omitir la agrupación, pero Mysql hará la agrupación por sí mismo, pero los resultados pueden no ser confiables, ya que elegirá la primera disponible. por eso tienes Beto se muestra en su resultado de 3 líneas.