SQL Group By Date Conflicts

У меня есть таблица с колонками 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, чтобы предоставить больше аргументации.

8
задан Peanut 4 October 2011 в 16:12
поделиться