Как правильно составить сложный MySQL запрос с группировкой записей по определённым критериям?
Собственно имеется таблица вида:
calls(src, dst, start, end) и еще некоторые не значащие поля
таблица заполнена следующим образом:
src dst | start | end
1 | 2 | 1970-01-01 10:00:00 | 1970-01-01 10:05:35
1 | 3 | 1970-01-01 10:00:00 | 1970-01-01 10:03:13
1 | 1 | 1970-01-01 10:03:13 | 1970-01-01 10:05:37
2 | 5 | 1970-01-01 10:03:20 | 1970-01-01 10:04:01
1 | 3 | 1970-01-01 10:07:15 | 1970-01-01 10:08:29
соответственно src номер с которого звонят, dst добавочный номер на который звонят,
задача стоит в том, чтобы получить количество реальных звонков, то есть все записи в пределах одного промежутка start - end для одного входящего номера, должны объединяться в одну, например для приведенной выше таблицы запрос должен вывести:
src | dst | start | end
1 | 2 | 1970-01-01 10:00:00 | 1970-01-01 10:05:37
2 | 5 | 1970-01-01 10:03:20 | 1970-01-01 10:04:01
1 | 3 | 1970-01-01 10:07:15 | 1970-01-01 10:08:29
в исходной таблице для нового звонка первая запись идет с началом и окончанием звонка, при этом завершение звонка покрывает собой все "переводы" данного номера на другие добавочные, при этом конец последнего разговора с этим номером для данного звонка может иметь погрешность +10 секунд, как в примере
предполагаю что надо использовать группировку с условиями, но не совсем понятно как объединять в одну запись, записи с тем же номером-источником и временным интервалом в рамках start-end, если при этом ни start, ни end, не совпадают со значениями самой первой записи для этого звонка, к тому же этот же номер может звонить позднее и это уже будет другой звонок, возможно лучше разделить на более конкретные запросы всю задачу и работать с ними уже в php, что подскажете?
Т.е Вы хотите сказать что в данном примере позвонили в 10:00 на номер 2,
мгновенно?!?? его редиректнули на номер 3, в 10:03:13 редиректнули его на номер 1 и в 10:05:37 разговор закончили, а в первой записи стоит ошибочное значение?
Я бы это вытащил в PHP и разгреб там, скрипт вроде бы не очень сложный должен получиться за O(N)
ну да, в базе это примерно в таком виде, как я уже говорил, первая запись о звонке содержит начало и конец всего разговора, однако иногда бывает так что конец последней записи о разговоре отличается от конца всего разговора на число секунд в промежутке до 10
поправлюсь, разница между переводом звонков все же есть и как правило, составляет порядка 10-30 секунд, то есть позвонили на номер 2 в 10:00, в 10:00:10 на номер 3, закончили разговор с 3 в 10:03:13 и начали с 1 в 10:03:30