Sí, usted puede hacer esto. La habilidad que necesita es el concepto de que hay dos formas de sacar tablas del servidor de tablas. Una forma es ..
FROM TABLE A
La otra forma es
FROM (SELECT col as name1, col2 as name2 FROM ...) B
Observe que la cláusula de selección y los paréntesis que la rodean son una mesa, una mesa virtual.
Entonces, usando su segundo ejemplo de código (supongo las columnas que espera recuperar aquí):
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 su tabla real attribute
es la primera tabla en esta combinación, y esta tabla virtual la he llamado b
es la segunda tabla.
Esta técnica resulta especialmente útil cuando la tabla virtual es una tabla de resumen de algún tipo. por ejemplo
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)
¿Ves cómo va eso? Ha generado una tabla virtual c
que contiene dos columnas, la unió a las otras dos, usó una de las columnas para ON
y devolvió la otra como una columna en su conjunto de resultados.