Como hacer una consulta anidada?
-
23-09-2019 - |
Pregunta
Tener una tabla de usuarios y hay un campo invited_by_id mostrando identificador de usuario de la persona que invitó a este usuario. Necesidad de hacer una consulta MySQL devolver filas con todos los campos de los usuarios, además de un campo invites_count que muestra cómo muchas personas fueron invitados por cada usuario. Algo como esto:
SELECT
User.*, Count.count
FROM
users AS User,
(
SELECT COUNT(*) AS count FROM users WHERE users.invited_by_id=User.id
) AS Count;
Éste no está funcionando, así que necesito un funcionamiento uno.
Solución
SELECT u.*,
(
SELECT COUNT(*)
FROM users ui
WHERE ui.invited_by_id = u.id
) AS cnt
FROM users u
Otros consejos
Ok, en primer lugar, count
es una palabra reservada en SQL por lo que no se puede utilizar como un alias de tabla (a menos que usted cita de alguna manera, pero no hacerlo). En segundo lugar, la verdadera manera de resolver este problema es introducir una cláusula en su GROUP BY
subconsulta.
Prueba esto:
SELECT user3.*, subquery.theCount FROM
users AS user3
INNER JOIN (
SELECT
user1.id, count(user2.id) AS theCount
FROM
users AS user1
LEFT OUTER JOIN
users AS user2 ON user2.invited_by_id=user1.id
GROUP BY user1.id
) AS subquery ON subquery.id=user3.id;
Aquí está un pequeño secreto sucio sobre MySQL: Se te permite engañar con la declaración GROUP BY
y seleccionar las columnas que no están en la lista GROUP BY
y tampoco en funciones de agregado. Otros RMDMSes no le permiten hacer esto.
SELECT
user1.*, count(user2.id) AS theCount
FROM
users AS user1
LEFT OUTER JOIN
users AS user2 ON user2.invited_by_id=user1.id
GROUP BY user1.id;