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.

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top