Question

Avoir un utilisateur de table et il y a un champ invited_by_id montrant l'ID utilisateur de la personne qui a invité cet utilisateur. Vous avez besoin de faire une requête renvoyant des lignes MySQL avec tous les champs des utilisateurs plus un champ invites_count montrant combien de personnes ont été invitées par chaque utilisateur. Quelque chose comme ceci:

SELECT
    User.*, Count.count
FROM
    users AS User,
    (
        SELECT COUNT(*) AS count FROM users WHERE users.invited_by_id=User.id
    ) AS Count;

Celui-ci ne fonctionne pas, alors je dois un travail.

Était-ce utile?

La solution

SELECT  u.*,
        (
        SELECT  COUNT(*)
        FROM    users ui
        WHERE   ui.invited_by_id = u.id
        ) AS cnt
FROM    users u    

Autres conseils

Ok, tout d'abord, count est un mot réservé dans SQL afin que vous ne pouvez pas l'utiliser comme un alias de table (à moins que vous citez en quelque sorte, mais ne le faites pas). En second lieu, la vraie façon de résoudre ce problème est d'introduire une clause de GROUP BY dans votre sous-requête.

Essayez ceci:

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;

Voici un sale petit secret à propos de MySQL: Il vous permet de tricher avec l'instruction GROUP BY et sélectionner des colonnes qui ne sont pas dans la liste des GROUP BY et pas non plus dans les fonctions d'agrégation. D'autres RMDMSes ne vous laissez pas faire.

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;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top