Ответ 1
Это один из способов получить результат.
Этот подход использует коррелированные подзапросы. Каждый подзапрос использует предложение 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
Followup
@gliese581g указывает, что с этим подходом могут возникать проблемы с производительностью с большим количеством строк, возвращаемых внешним запросом, поскольку каждый подзапрос в списке SELECT выполняется для каждой строки, возвращенной во внешнем запросе.
Нельзя сказать, что этот подход кричит для индекса:
ON table2 (PKID_FROM_TABLE_1, U_DATA)
-или, как минимум -
ON table2 (PKID_FROM_TABLE_1)
Вероятно, последний индекс уже существует, если имеется внешний ключ. Первый индекс позволит полностью выполнить запрос с индексных страниц ( "Использование индекса" ) без необходимости операции сортировки ( "Использование файлового набора" ).
@glies581g совершенно правильно указать, что производительность этого подхода может быть проблематичной на "больших" наборах.