Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

SQL SELECT Satu-ke-Banyak menjadi satu baris

Ini adalah salah satu cara untuk mendapatkan hasilnya.

Pendekatan ini menggunakan subquery yang berkorelasi. Setiap subkueri menggunakan ORDER BY klausa untuk mengurutkan baris terkait dari tabel2, dan menggunakan LIMIT klausa untuk mengambil baris ke-1, ke-2, dan ke-3.

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  

TINDAK LANJUT

@gliese581g menunjukkan bahwa mungkin ada masalah kinerja dengan pendekatan ini, dengan sejumlah besar baris yang dikembalikan oleh kueri luar, karena setiap subkueri dalam daftar SELECT dieksekusi untuk setiap baris yang dikembalikan dalam kueri luar.

Tak perlu dikatakan lagi bahwa pendekatan ini menuntut indeks:

ON table2 (PKID_FROM_TABLE_1, U_DATA)

-atau, minimal-

ON table2 (PKID_FROM_TABLE_1)

Kemungkinan indeks yang terakhir sudah ada, jika ada kunci asing yang ditentukan. Indeks sebelumnya akan memungkinkan kueri dipenuhi sepenuhnya dari halaman indeks ("Menggunakan indeks"), tanpa perlu operasi pengurutan ("Menggunakan filesort").

@glies581g cukup tepat untuk menunjukkan bahwa kinerja pendekatan ini dapat menjadi masalah pada set "besar".



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara menggunakan regex di MySQL?

  2. Apa perilaku untuk operator minus antara dua datetime di MySQL?

  3. Gunakan Single Row Query dengan MySQL dan PHP

  4. Cara menggunakan DELETE ON CASCADE pada relasi banyak-ke-satu

  5. Kelompokkan Mysql dengan dua kolom dan pilih nilai maksimum kolom ketiga