sql >> データベース >  >> RDS >> Mysql

1対多のSQLSELECTを1行に

    これは結果を得る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は、このアプローチのパフォーマンスが「大規模な」セットで問題になる可能性があることを指摘するのは非常に正しいです。



    1. MySQL-コンマを使用して値を単一の文字列に分割する方法

    2. djangoの動的データベーステーブル

    3. 失敗したRails移行のロールバック

    4. ストアドプロシージャを使用する利点と欠点