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

MySQL:Bisakah saya melakukan join kiri dan menarik hanya satu baris dari tabel join?

Biarkan saya meringkas apa yang saya pahami:Anda ingin memilih setiap tiket dan solusi terakhirnya.

Saya suka menggunakan pola berikut untuk pertanyaan semacam ini karena menghindari pola subquery dan karena itu lebih baik jika kinerja diperlukan. Kekurangannya agak susah dipahami:

SELECT
  t.*,
  s1.*
FROM tickets t
INNER JOIN solutions s1 ON t.id = s1.ticket_id
LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id AND s2.id > s1.id
WHERE s2.id IS NULL;

Saya hanya menulis inti dari pola untuk pemahaman yang lebih baik.

Kuncinya adalah:

  • LEFT JOIN dari solutions tabel dengan dirinya sendiri dengan s1.ticket_id = s2.ticket_id kondisi:mengemulasi GROUP BY ticket_id .

  • syarat s2.id > s1.id :ini adalah SQL untuk "Saya hanya ingin solusi terakhir", ini mengemulasi MAX() . Saya berasumsi bahwa dalam model Anda, the last artinya with the greatest id tetapi Anda bisa menggunakan di sini kondisi pada tanggal. Perhatikan bahwa s2.id < s1.id akan memberi Anda solusi pertama.

  • klausa WHERE s2.id IS NULL :yang paling aneh tapi mutlak diperlukan... hanya menyimpan catatan yang Anda inginkan.

Cobalah dan beri tahu saya :)

Edit 1 Saya baru menyadari bahwa asumsi poin kedua terlalu menyederhanakan masalah. Itu membuatnya lebih menarik :p Saya mencoba melihat bagaimana pola ini bekerja dengan date, id Anda memesan.

Edit 2 Ok, ini bekerja dengan baik dengan sedikit twist. Kondisi pada LEFT JOIN menjadi:

LEFT JOIN solutions s2 ON s1.ticket_id = s2.ticket_id
  AND (s2.date > s1.date OR (s2.date = s1.date AND s2.id > s1.id))


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masukan pengguna yang sangat sederhana di Django

  2. Dapatkan jalur pohon di tabel MySQL

  3. Bagaimana cara melakukan pencarian aksen dan case-insensitive di database MediaWiki?

  4. Tidak dapat mengambil metadata proyek. Pastikan ini adalah proyek .NET Core berbasis MSBuild

  5. Laravel:terhubung ke database secara dinamis