Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Um-para-muitos SQL SELECT em uma única linha


Esta é uma forma de obter o resultado.

Essa abordagem usa subconsultas correlacionadas. Cada subconsulta usa um ORDER BY cláusula para classificar as linhas relacionadas da tabela2 e usa o LIMIT cláusula para recuperar a 1ª, 2ª e 3ª linhas.
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  

SEGUIR

@gliese581g aponta que pode haver problemas de desempenho com essa abordagem, com um grande número de linhas retornadas pela consulta externa, pois cada subconsulta na lista SELECT é executada para cada linha retornada na consulta externa.

Não é preciso dizer que essa abordagem exige um índice:
ON table2 (PKID_FROM_TABLE_1, U_DATA)

-ou, no mínimo-
ON table2 (PKID_FROM_TABLE_1)

É provável que o último índice já exista, se houver uma chave estrangeira definida. O índice anterior permitiria que a consulta fosse satisfeita inteiramente a partir das páginas de índice ("Usando índice"), sem a necessidade de uma operação de classificação ("Usando classificação de arquivos").

@glies581g está certo em apontar que o desempenho dessa abordagem pode ser problemático em conjuntos "grandes".