sql >> Databáze >  >> RDS >> Mysql

One-to-Many SQL SELECT do jednoho řádku

Toto je jeden způsob, jak dosáhnout výsledku.

Tento přístup používá korelované poddotazy. Každý dílčí dotaz používá ORDER BY klauzule k řazení souvisejících řádků z tabulky2 a používá LIMIT klauzule k načtení 1., 2. a 3. řady.

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  

NÁSLEDUJÍCÍ

@gliese581g poukazuje na to, že u tohoto přístupu mohou nastat problémy s výkonem s velkým počtem řádků vrácených vnějším dotazem, protože každý poddotaz v seznamu SELECT se provede pro každý řádek vrácený ve vnějším dotazu.

Je samozřejmé, že tento přístup volá po indexu:

ON table2 (PKID_FROM_TABLE_1, U_DATA)

-nebo minimálně-

ON table2 (PKID_FROM_TABLE_1)

Je pravděpodobné, že druhý index již existuje, pokud je definován cizí klíč. Dřívější index by umožnil, aby byl dotaz plně uspokojen z indexových stránek ("Using index"), bez nutnosti operace řazení ("Using filesort").

@glies581g zcela správně poukazuje na to, že výkon tohoto přístupu může být problematický na "velkých" souborech.



  1. MySql v DNX 5.0

  2. MySQL odstraní duplicitní záznamy, ale ponechá nejnovější

  3. jak vypsat výsledek dotazu mysql v konkrétní sekvenci?

  4. postgres:upgradovat uživatele na superuživatele?