Como fazer uma consulta aninhada?
-
23-09-2019 - |
Pergunta
Tenha uma tabela usuários e há um campo convidado_by_id mostrando ID de usuário da pessoa que convidou esse usuário. Precisa fazer uma consulta MySQL de retorno linhas com todos os campos dos usuários, além de um campo convites_count mostrando quantas pessoas foram convidadas por cada usuário. Algo assim:
SELECT
User.*, Count.count
FROM
users AS User,
(
SELECT COUNT(*) AS count FROM users WHERE users.invited_by_id=User.id
) AS Count;
Este não está funcionando, então eu preciso de um funcionando.
Solução
SELECT u.*,
(
SELECT COUNT(*)
FROM users ui
WHERE ui.invited_by_id = u.id
) AS cnt
FROM users u
Outras dicas
OK, primeiro de tudo, count
é uma palavra reservada no SQL para que você não possa usá -la como um alias de tabela (a menos que você a cite de alguma forma, mas não faça isso). Em segundo lugar, a verdadeira maneira de resolver esse problema é introduzir um GROUP BY
Cláusula em sua subconsulta.
Experimente isso:
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;
Aqui está um pequeno segredo sujo sobre o mysql: permite trapacear com o GROUP BY
declaração e selecione colunas que não estão no GROUP BY
Lista e também não em funções agregadas. Outros rmdms não permitem que você faça isso.
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;