これは結果を得る1つの方法です。
このアプローチでは、相関サブクエリを使用します。各サブクエリはORDER BY
を使用します table2から関連する行を並べ替える句で、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)
外部キーが定義されている場合は、後者のインデックスがすでに存在している可能性があります。前者のインデックスを使用すると、並べ替え操作(「filesortの使用」)を必要とせずに、インデックスページからクエリを完全に満たすことができます(「インデックスの使用」)。
@ glies581gは、このアプローチのパフォーマンスが「大規模な」セットで問題になる可能性があることを指摘するのは非常に正しいです。