Това е един от начините да получите резултат.
Този подход използва корелирани подзаявки. Всяка подзаявка използва ORDER BY
клауза за сортиране на свързаните редове от таблица 2 и използва LIMIT
клауза за извличане на 1-ви, 2-ри и 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
ПОСЛЕДВАНЕ
@gliese581g посочва, че може да има проблеми с производителността при този подход, с голям брой редове, върнати от външната заявка, тъй като всяка подзаявка в списъка SELECT се изпълнява за всеки ред, върнат във външната заявка.
От само себе си се разбира, че този подход изисква индекс:
ON table2 (PKID_FROM_TABLE_1, U_DATA)
-или най-малкото-
ON table2 (PKID_FROM_TABLE_1)
Вероятно последният индекс вече съществува, ако има дефиниран външен ключ. Предишният индекс би позволил заявката да бъде удовлетворена изцяло от индексните страници („Използване на индекс“), без да е необходима операция за сортиране („Използване на сортиране на файлове“).
@glies581g е съвсем прав да посочи, че изпълнението на този подход може да бъде проблематично при "големи" набори.