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

Bergabunglah dengan satu baris dari tabel di MySQL

Ini adalah masalah terbesar-n-per-grup yang sering muncul di Stack Overflow.

Inilah jawaban saya yang biasa:

select
  p.name        player,
  s.date        first_score,
  s.points      points

from  players p

join  scores  s
  on  s.player_id = p.id

left outer join scores  s2
  on  s2.player_id = p.id
      and s2.date < s.date

where
  s2.player_id is null

;

Dengan kata lain, diberikan skor s, coba cari skor s2 untuk pemain yang sama, tetapi dengan tanggal yang lebih awal. Jika tidak ada skor lebih awal yang ditemukan, maka s adalah yang paling awal.

Komentar Anda tentang dasi:Anda harus memiliki kebijakan yang mana yang akan digunakan jika dasi. Salah satu kemungkinannya adalah jika Anda menggunakan kunci utama yang bertambah secara otomatis, yang memiliki nilai paling sedikit adalah yang lebih awal. Lihat istilah tambahan di outer join di bawah ini:

select
  p.name        player,
  s.date        first_score,
  s.points      points

from  players p

join  scores  s
  on  s.player_id = p.id

left outer join scores  s2
  on  s2.player_id = p.id
      and (s2.date < s.date or s2.date = s.date and s2.id < s.id)

where
  s2.player_id is null

;

Pada dasarnya Anda perlu menambahkan istilah tiebreaker sampai Anda turun ke kolom yang dijamin unik, setidaknya untuk pemain yang diberikan. Kunci utama tabel sering kali merupakan solusi terbaik, tetapi saya telah melihat kasus di mana kolom lain cocok.

Mengenai komentar yang saya bagikan dengan @OMG Ponies, ingatlah bahwa jenis kueri ini sangat diuntungkan dari indeks yang tepat.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mysql kiri bergabung dengan kondisi di tabel kanan

  2. EntityFramework 6 Alpha 2 &Konektor MySQL/NET 6.6.4

  3. Bagaimana cara menghapus MySQL sepenuhnya dengan file konfigurasi dan perpustakaan?

  4. Perbarui klien C# setiap kali basis data diperbarui

  5. Bagaimana cara memperbarui catatan menggunakan sekuel untuk simpul?