sql >> Database >  >> RDS >> Mysql

Een-op-veel SQL SELECT in één rij

Dit is een manier om het resultaat te krijgen.

Deze benadering maakt gebruik van gecorreleerde subquery's. Elke subquery gebruikt een ORDER BY clausule om de gerelateerde rijen uit tabel 2 te sorteren en gebruikt de LIMIT clausule om de 1e, 2e en 3e rij op te halen.

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  

VERVOLG

@gliese581g wijst erop dat er prestatieproblemen kunnen optreden bij deze aanpak, aangezien een groot aantal rijen wordt geretourneerd door de buitenste query, aangezien elke subquery in de SELECT-lijst wordt uitgevoerd voor elke rij die wordt geretourneerd in de buitenste query.

Het spreekt voor zich dat deze aanpak om een ​​index schreeuwt:

ON table2 (PKID_FROM_TABLE_1, U_DATA)

-of, op zijn minst-

ON table2 (PKID_FROM_TABLE_1)

Het is waarschijnlijk dat de laatste index al bestaat, als er een externe sleutel is gedefinieerd. Met de vorige index kan de zoekopdracht volledig worden uitgevoerd vanaf de indexpagina's ("Index gebruiken"), zonder dat een sorteerbewerking nodig is ("Fisor gebruiken").

@glies581g wijst er terecht op dat de uitvoering van deze aanpak problematisch kan zijn op "grote" sets.



  1. Kan een Android-app rechtstreeks verbinding maken met een online mysql-database?

  2. PHP, MySQL - kun je onderscheid maken tussen rijen die overeenkomen en rijen die zijn beïnvloed?

  3. Ongeldige PathExpression. Moet een StateFieldPathExpression zijn

  4. Links en rechts samenvoegen met het plusteken (+) in Oracle