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.

¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top