Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

MySQL:Tôi có thể thực hiện phép nối bên trái và chỉ kéo một hàng từ bảng tham gia không?

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ới s1.ticket_id = s2.ticket_id điều kiện:nó mô phỏng GROUP 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ỏng MAX() . 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ằng s2.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))


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Đặt lại mật khẩu ROOT trong MySQL 5.6

  2. Định dạng mảng PHP cho mệnh đề SQL IN

  3. Kết nối với MariaDB từ ứng dụng Java trong NetBeans trên Linux (Mageia)

  4. MySQL TỐI ƯU hóa tất cả các bảng?

  5. LAST_INSERT_ID () MySQL