Tak, możesz to zrobić. Potrzebny talent to koncepcja, że istnieją dwa sposoby na usunięcie stołów z serwera stołowego. Jednym ze sposobów jest ..
FROM TABLE A
Inny sposób to
FROM (SELECT col as name1, col2 as name2 FROM ...) B
Zauważ, że klauzula select i nawiasy wokół niej są stół, wirtualny stół.
Tak więc, korzystając z drugiego przykładu kodu (zgaduję, że masz nadzieję pobrać tutaj):
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)
Zauważ, że twój prawdziwy attribute
tabeli jest pierwszą tabelą w tym sprzężeniu i ta wirtualna tabela, którą nazwałem b
to druga tabela.
Ta technika jest szczególnie przydatna, gdy wirtualna tabela jest pewnego rodzaju tabelą podsumowującą. np.
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)
Widzisz, jak to idzie? Wygenerowałeś wirtualną tabelę c
zawierające dwie kolumny, połączył je z pozostałymi dwoma, użył jednej z kolumn dla ON
klauzuli i zwrócił drugą jako kolumnę w zestawie wyników.