Ini adalah salah satu cara untuk mendapatkan hasilnya.
Pendekatan ini menggunakan subquery yang berkorelasi. Setiap subkueri menggunakan ORDER BY
klausa untuk mengurutkan baris terkait dari tabel2, dan menggunakan LIMIT
klausa untuk mengambil baris ke-1, ke-2, dan ke-3.
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
TINDAK LANJUT
@gliese581g menunjukkan bahwa mungkin ada masalah kinerja dengan pendekatan ini, dengan sejumlah besar baris yang dikembalikan oleh kueri luar, karena setiap subkueri dalam daftar SELECT dieksekusi untuk setiap baris yang dikembalikan dalam kueri luar.
Tak perlu dikatakan lagi bahwa pendekatan ini menuntut indeks:
ON table2 (PKID_FROM_TABLE_1, U_DATA)
-atau, minimal-
ON table2 (PKID_FROM_TABLE_1)
Kemungkinan indeks yang terakhir sudah ada, jika ada kunci asing yang ditentukan. Indeks sebelumnya akan memungkinkan kueri dipenuhi sepenuhnya dari halaman indeks ("Menggunakan indeks"), tanpa perlu operasi pengurutan ("Menggunakan filesort").
@glies581g cukup tepat untuk menunjukkan bahwa kinerja pendekatan ini dapat menjadi masalah pada set "besar".