Hãy để tôi tóm tắt những gì tôi hiểu:bạn muốn chọn từng vé và giải pháp cuối cùng của nó.
Tôi thích sử dụng mẫu sau cho loại câu hỏi này vì nó tránh mẫu truy vấn con và do đó khá tốt khi cần hiệu suất. Hạn chế là nó hơi khó hiểu:
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;
Tôi chỉ viết phần trung tâm của mẫu để hiểu rõ hơn.
Các chìa khóa là:
-
THAM GIA TRÁI của
solutions
bảng với chính nó vớis1.ticket_id = s2.ticket_id
điều kiện:nó mô phỏngGROUP BY ticket_id
. -
điều kiện
s2.id > s1.id
:nó là SQL cho "Tôi chỉ muốn giải pháp cuối cùng", nó mô phỏngMAX()
. Tôi giả định rằng trong mô hình của bạn,the last
có nghĩa làwith the greatest id
nhưng bạn có thể sử dụng ở đây một điều kiện vào ngày. Lưu ý rằngs2.id < s1.id
sẽ cung cấp cho bạn giải pháp đầu tiên. -
mệnh đề WHERE
s2.id IS NULL
:điều kỳ lạ nhất nhưng thực sự cần thiết ... chỉ giữ những bản ghi bạn muốn.
Hãy thử và cho tôi biết :)
Chỉnh sửa 1: Tôi chỉ nhận ra rằng giả định điểm thứ hai đang đơn giản hóa vấn đề. Điều đó khiến nó thậm chí còn thú vị hơn:p Tôi đang cố gắng xem mẫu này có thể hoạt động như thế nào với date, id
của bạn đặt hàng.
Chỉnh sửa 2: Ok, nó hoạt động tuyệt vời với một chút thay đổi. Điều kiện trên LEFT JOIN trở thành:
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))