Multiple mysql 'select from' em uma consulta

1

SELECT (SELECT user_id FROM users WHERE user_id=1) AS user_id, (SELECT usersetting_user_id FROM usersettings WHERE usersetting_user_id=1) AS usersetting_user_id;

isso retorna:

| user_id | usersetting_user_id |  
|       1 |                   1 |

mas quero exibir todos os usuários, não apenas um. Então eu corro o seguinte:

SELECT (SELECT user_id FROM users) AS user_id, (SELECT usersetting_user_id FROM usersettings) AS usersetting_user_id;''

e obtenha:

ERROR 1242 (21000): Subquery returns more than 1 row

Alguma ideia de como contornar isso?

    
por w00t 30.05.2012 / 10:52

3 respostas

5

Você deve usar uma declaração join da seguinte forma:

SELECT u.user_id, us.usersetting_user_id
FROM users u
JOIN usersettings us ON u.user_id = us.usersetting_user_id

Isso pressupõe userettings.usersetting_user_id é uma referência à chave primária (user_id) dos usuários. Detalhes específicos podem ser encontrados no manual .

    
por 30.05.2012 / 10:56
2

Atribua aliases na cláusula FROM e use alias.fieldname . Também agrupe SELECT e FROM parts

SELECT user_id.user_id, usersetting_user_id.usersetting_user_id
FROM users AS user_id, usersettings AS usersetting_user_id;
    
por 30.05.2012 / 11:07
0

Eu não recomendo usar em consultas como esta Junções ou múltiplos froms porque você está carregando todas as tabelas e depois filtrando-as. É como usar tendo em vez de onde. Está relacionado na versão do servidor mysql, mas você pode compará-lo com EXPLAIN (ou EXPLAIN EXTENDED).

No seu caso eu recomendo que você use uma tabela da diretiva (tabela básica, usuários por exemplo), e carregue outros dados com consultas internas com Where id = user_id.

# query with basic table only
SELECT
  user_id
FROM users AS u;
# extended query
SELECT
  user_id,
  (SELECT usersetting_user_id
    FROM usersettings
    WHERE usersetting_user_id = u.user_id) AS usersetting_user_id
FROM users AS u;

p. Se você sabe que suas tabelas têm a mesma contagem de linhas, você pode usar a solução com Join by Tzarium, mas como INNER / LEFT / RIGHT JOIN ao invés de JOIN ou OUTER JOIN.

    
por 30.05.2012 / 14:29

Tags