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 dengans1.ticket_id = s2.ticket_id
kondisi:mengemulasiGROUP BY ticket_id
. -
syarat
s2.id > s1.id
:ini adalah SQL untuk "Saya hanya ingin solusi terakhir", ini mengemulasiMAX()
. Saya berasumsi bahwa dalam model Anda,the last
artinyawith the greatest id
tetapi Anda bisa menggunakan di sini kondisi pada tanggal. Perhatikan bahwas2.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))