Mysql
 sql >> Database >  >> RDS >> Mysql

Uno a molti SQL SELECT in una singola riga

Questo è un modo per ottenere il risultato.

Questo approccio utilizza sottoquery correlate. Ogni sottoquery utilizza un ORDER BY clausola per ordinare le righe correlate da table2 e utilizza il LIMIT clausola per recuperare la prima, la seconda e la terza riga.

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  

SEGUITO

@gliese581g sottolinea che potrebbero esserci problemi di prestazioni con questo approccio, con un numero elevato di righe restituite dalla query esterna, poiché ogni sottoquery nell'elenco SELECT viene eseguita per ogni riga restituita nella query esterna.

Va da sé che questo approccio richiede un indice:

ON table2 (PKID_FROM_TABLE_1, U_DATA)

-o, come minimo-

ON table2 (PKID_FROM_TABLE_1)

È probabile che quest'ultimo indice esista già, se è stata definita una chiave esterna. Il primo indice consentirebbe di soddisfare interamente la query dalle pagine dell'indice ("Utilizzo dell'indice"), senza la necessità di un'operazione di ordinamento ("Utilizzo di filesort").

@glies581g ha ragione nel sottolineare che le prestazioni di questo approccio possono essere problematiche su set "grandi".