Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Selecionando várias colunas/campos na subconsulta do MySQL


Sim, você pode fazer isso. O truque que você precisa é o conceito de que existem duas maneiras de tirar as mesas do servidor de mesa. Uma maneira é..
FROM TABLE A

A outra maneira é
FROM (SELECT col as name1, col2 as name2 FROM ...) B

Observe que a cláusula select e os parênteses em torno dela são uma mesa, uma mesa virtual.

Então, usando seu segundo exemplo de código (estou supondo as colunas que você espera recuperar aqui):
SELECT a.attr, b.id, b.trans, b.lang
FROM attribute a
JOIN (
 SELECT at.id AS id, at.translation AS trans, at.language AS lang, a.attribute
 FROM attributeTranslation at
) b ON (a.id = b.attribute AND b.lang = 1)

Observe que sua tabela real attribute é a primeira tabela nesta junção, e que esta tabela virtual eu chamei de b é a segunda mesa.

Essa técnica é especialmente útil quando a tabela virtual é uma tabela de resumo de algum tipo. por exemplo.
SELECT a.attr, b.id, b.trans, b.lang, c.langcount
FROM attribute a
JOIN (
 SELECT at.id AS id, at.translation AS trans, at.language AS lang, at.attribute
 FROM attributeTranslation at
) b ON (a.id = b.attribute AND b.lang = 1)
JOIN (
 SELECT count(*) AS langcount,  at.attribute
 FROM attributeTranslation at
 GROUP BY at.attribute
) c ON (a.id = c.attribute)

Veja como isso vai? Você gerou uma tabela virtual c contendo duas colunas, juntou-se às outras duas, usou uma das colunas para o ON cláusula e retornou a outra como uma coluna em seu conjunto de resultados.