Come fare una query nidificate?
-
23-09-2019 - |
Domanda
Avere un utente da tavolo e non v'è un campo che mostra invited_by_id ID utente della persona che ha invitato questo utente. Hai bisogno di fare una query MySQL ritorno file con tutti i campi degli utenti, più un campo invites_count che mostra quante persone sono state invitate da ciascun utente. Qualcosa di simile a questo:
SELECT
User.*, Count.count
FROM
users AS User,
(
SELECT COUNT(*) AS count FROM users WHERE users.invited_by_id=User.id
) AS Count;
Questo non sta funzionando quindi ho bisogno di uno che lavora.
Soluzione
SELECT u.*,
(
SELECT COUNT(*)
FROM users ui
WHERE ui.invited_by_id = u.id
) AS cnt
FROM users u
Altri suggerimenti
Ok, prima di tutto, count
è una parola riservata in SQL quindi non è possibile utilizzarlo come un alias di tabella (a meno che non si cita in qualche modo, ma non farlo). In secondo luogo, il vero modo per risolvere questo problema è quello di introdurre una clausola GROUP BY
nel subquery.
Prova questo:
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;
Ecco un piccolo segreto su MySQL: Esso consente di barare con la dichiarazione GROUP BY
e selezionare le colonne che non non sono nella lista GROUP BY
e anche nelle funzioni di aggregazione. Altri RMDMSes non consentono di fare questo.
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;