Mysql
 sql >> Datenbank >  >> RDS >> Mysql

One-to-Many-SQL-SELECT in einzelne Zeile

Dies ist eine Möglichkeit, das Ergebnis zu erhalten.

Dieser Ansatz verwendet korrelierte Unterabfragen. Jede Unterabfrage verwendet einen ORDER BY -Klausel, um die zugehörigen Zeilen aus Tabelle2 zu sortieren, und verwendet das LIMIT -Klausel, um die 1., 2. und 3. Zeile abzurufen.

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  

NACHVERFOLGUNG

@gliese581g weist darauf hin, dass es bei diesem Ansatz mit einer großen Anzahl von Zeilen, die von der äußeren Abfrage zurückgegeben werden, zu Leistungsproblemen kommen kann, da jede Unterabfrage in der SELECT-Liste für jede Zeile ausgeführt wird, die in der äußeren Abfrage zurückgegeben wird.

Dass dieser Ansatz nach einem Index schreit, versteht sich von selbst:

ON table2 (PKID_FROM_TABLE_1, U_DATA)

-oder zumindest-

ON table2 (PKID_FROM_TABLE_1)

Es ist wahrscheinlich, dass der letztere Index bereits existiert, wenn ein Fremdschlüssel definiert ist. Der frühere Index würde es ermöglichen, dass die Abfrage vollständig von den Indexseiten ("Using index") erfüllt wird, ohne dass eine Sortieroperation ("Using filesort") erforderlich ist.

@glies581g weist völlig zu Recht darauf hin, dass die Leistung dieses Ansatzes bei "großen" Sets problematisch sein kann.