У меня есть таблица с колонками start_date и end_date. Нужно выбрать все и сгруппировать их по конфликтам дат для каждого Object_ID.
Конфликт дат - это когда дата начала и/или дата окончания строки проходит через дату другой строки. Например, вот некоторые примеры конфликтов:
В строке 1 есть даты с 1-й по 5-ю, в строке 2 есть даты со 2-й по 3-ю.
Строка 1 имеет даты со 2-й по 5-ю, строка 2 имеет даты с 1-й по 3-ю.
В ряду 1 - даты со 2-й по 5-ю, в ряду 2 - с 3-й по 6-ю.
В ряду 1 - даты со 2-й по 5-ю, в ряду 2 - с 1-й по 7-ю.
Итак, например, если у нас есть некоторые примеры данных (для простоты предположим, что числа - это просто дни месяца):
id | object_id | start_date | end_date
1 | 1 | 1 | 5
2 | 1 | 2 | 4
3 | 1 | 6 | 8
4 | 2 | 2 | 3
То, что я ожидал бы увидеть, выглядит так:
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
5 | 2 | 4 | 5
6 | 1 | 2 | 3
7 | 1 | 10 | 12
8 | 1 | 11 | 13
И для второго тестового примера, что я ожидал бы увидеть в качестве вывода:
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
Да, мне понадобится какой-то способ дифференцировать первую и вторую группировку (первая и последняя строки), но я еще не совсем понял это. Цель состоит в том, чтобы просмотреть этот список, а затем, когда вы нажмете на группу конфликтов, вы сможете просмотреть все конфликты в этой группе.
Моей первой мыслью было попытаться использовать какой-нибудь пункт GROUP BY CASE ..., но я просто закрутил голову.
Язык, который я использую для вызова mysql - php. Так что если кто-то знает решение на основе php-петли, а не большого запроса к mysql, я весь внимание.
Заранее спасибо.
Edit: Added in primary Keys to provide a little less confusion.
Редактировать: Добавил тестовый пример 2, чтобы предоставить больше аргументации.