Comment faire une requête imbriquée?
-
23-09-2019 - |
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.
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;