Tôi có một bảng có các cột start_date và end_date. Những gì chúng ta cần làm là Chọn tất cả mọi thứ và nhóm chúng theo các xung đột ngày cho mỗi Object_ID.Nhóm SQL theo các xung đột ngày
Xung đột ngày là thời điểm ngày bắt đầu và/hoặc ngày kết thúc của hàng vượt qua các hàng khác '. Ví dụ: dưới đây là một số ví dụ về xung đột:
Hàng 1 có ngày từ 1 đến ngày 5, Hàng 2 có từ ngày 2 đến ngày 3.
Hàng 1 có từ ngày 2 đến ngày 5, Hàng 2 có ngày từ 1 đến ngày 3.
Hàng 1 có từ ngày 2 đến ngày 5, Hàng 2 có từ ngày 3 đến ngày 6.
Hàng 1 có từ ngày 2 đến ngày 5, Hàng 2 có từ ngày 1 đến ngày 7.
Vì vậy, ví dụ, nếu chúng ta có một số dữ liệu mẫu (giả định con số này chỉ vài ngày của tháng vì đơn giản):
object_id | start_date | end_date | numconflicts
1 | <na> | <na> | 2
1 | 6 | 8 | 0 or null
2 | 2 | 3 | 0 or null
:
id | object_id | start_date | end_date
1 | 1 | 1 | 5
2 | 1 | 2 | 4
3 | 1 | 6 | 8
4 | 2 | 2 | 3
gì tôi mong chờ để xem đây là
Và đối với Trường hợp thử nghiệm thứ hai, Dưới đây là một số dữ liệu mẫu:
id | object_id | start_date | end_date
1 | 1 | 1 | 5
2 | 1 | 2 | 4
3 | 1 | 6 | 8
4 | 2 | 2 | 3
5 | 2 | 4 | 5
6 | 1 | 2 | 3
7 | 1 | 10 | 12
8 | 1 | 11 | 13
Và đối với Trường hợp thử nghiệm thứ hai, tôi mong đợi để xem là đầu ra:
object_id | start_date | end_date | numconflicts
1 | <na> | <na> | 3
1 | 6 | 8 | 0 or null
2 | 2 | 3 | 0 or null
2 | 4 | 5 | 0 or null
1 | <na> | <na> | 2
Vâng, tôi sẽ cần một số cách phân biệt nhóm thứ nhất và nhóm thứ hai (hàng đầu tiên và cuối cùng) nhưng tôi không hiểu rõ điều đó. Mục tiêu là để xem danh sách này và sau đó khi bạn nhấp vào một nhóm xung đột, bạn có thể xem tất cả các xung đột trong nhóm đó.
Suy nghĩ đầu tiên của tôi là thử một số mệnh đề GROUP BY CASE ... nhưng tôi chỉ bị bao quanh bởi chính nó.
Ngôn ngữ tôi đang sử dụng để gọi mysql là php. Vì vậy, nếu ai đó biết về một giải pháp vòng lặp php hơn là một truy vấn mysql lớn, tôi là tất cả các tai.
Xin cảm ơn trước.
Chỉnh sửa: Được thêm vào khóa chính để cung cấp ít nhầm lẫn hơn một chút.
Chỉnh sửa: Đã thêm trong trường hợp Kiểm tra 2 để cung cấp một số lý do khác.
không, object_id không đề cập đến các id của bảng, nó chỉ đề cập đến một đối tượng vào một bảng khác nhau với id đó. Có nghĩa là, chỉ những hàng có object_id tương tự mới có thể có khả năng bị xung đột. – Peanut
Chỉ là một ý nghĩ: Nếu bạn đang dự định các hàng xung đột có thể nhấp và mở rộng, việc đặt '' thay vì ngày thực tế dường như không có ý nghĩa gì nhiều. Nếu tôi là bạn, tôi có thể sử dụng 'MIN (start_date) AS start_date' và' MAX (end_date) AS end_date' cho các hàng xung đột. Bằng cách đó, người dùng có thể thấy ngay lập tức phạm vi ngày mà nhóm xung đột thuộc về, mà không phải nhấp/mở rộng phạm vi ngày đầu tiên. –