Oui, vous pouvez le faire. Le talent dont vous avez besoin est le concept selon lequel il existe deux façons d'extraire des tables du serveur de table. Une façon est ..
FROM TABLE A
L'autre façon est
FROM (SELECT col as name1, col2 as name2 FROM ...) B
Notez que la clause select et les parenthèses qui l'entourent sont une table, une table virtuelle.
Donc, en utilisant votre deuxième exemple de code (je devine les colonnes que vous espérez récupérer ici) :
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)
Notez que votre vraie table attribute
est la première table de cette jointure, et que cette table virtuelle que j'ai appelée b
est la deuxième table.
Cette technique est particulièrement pratique lorsque la table virtuelle est une table récapitulative quelconque. ex.
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)
Vous voyez comment ça se passe ? Vous avez généré une table virtuelle c
contenant deux colonnes, l'a joint aux deux autres, a utilisé l'une des colonnes pour le ON
clause, et a renvoyé l'autre sous forme de colonne dans votre jeu de résultats.