Toto je jeden způsob, jak dosáhnout výsledku.
Tento přístup používá korelované poddotazy. Každý dílčí dotaz používá ORDER BY
klauzule k řazení souvisejících řádků z tabulky2 a používá LIMIT
klauzule k načtení 1., 2. a 3. řady.
SELECT a.PKID
, a.DATA
, (SELECT b1.U_DATA FROM table2 b1
WHERE b1.PKID_FROM_TABLE_1 = a.PKID
ORDER BY b1.U_DATA LIMIT 0,1
) AS U_DATA1
, (SELECT b2.U_DATA FROM table2 b2
WHERE b2.PKID_FROM_TABLE_1 = a.PKID
ORDER BY b2.U_DATA LIMIT 1,1
) AS U_DATA2
, (SELECT b3.U_DATA FROM table2 b3
WHERE b3.PKID_FROM_TABLE_1 = a.PKID
ORDER BY b3.U_DATA LIMIT 2,1
) AS U_DATA3
FROM table1 a
ORDER BY a.PKID
NÁSLEDUJÍCÍ
@gliese581g poukazuje na to, že u tohoto přístupu mohou nastat problémy s výkonem s velkým počtem řádků vrácených vnějším dotazem, protože každý poddotaz v seznamu SELECT se provede pro každý řádek vrácený ve vnějším dotazu.
Je samozřejmé, že tento přístup volá po indexu:
ON table2 (PKID_FROM_TABLE_1, U_DATA)
-nebo minimálně-
ON table2 (PKID_FROM_TABLE_1)
Je pravděpodobné, že druhý index již existuje, pokud je definován cizí klíč. Dřívější index by umožnil, aby byl dotaz plně uspokojen z indexových stránek ("Using index"), bez nutnosti operace řazení ("Using filesort").
@glies581g zcela správně poukazuje na to, že výkon tohoto přístupu může být problematický na "velkých" souborech.