Как сделать выборку из таблицы с условием на совпадения в диапазоне?

Пролог:

Есть таблица в БД, с основными полями service_time[тип поля:time],master[тип поля:varchar],date[тип поля:date],time[тип поля:time]. В результате прямого модифицирования таблицы (по своей глупости, но уже исправлять поздно) путем запросов UPDATE, предполагаю, что целостность БД - пострадала. Это приведет к необратимым логическим сбоям.


Пример хранимых данных:

create table cl
(
    ID_client       int auto_increment
        primary key
    service_time    time        not null,
    master          varchar(24) not null,
    date            date        not null,
    time            time        not null,
);

INSERT INTO cl (service_time, master, date, time) VALUES ('02:00:00', 'Lana', '2020-07-18', '14:30:00');
INSERT INTO cl (service_time, master, date, time) VALUES ('02:00:00', 'Lana', '2020-07-19', '14:30:00');
INSERT INTO cl (service_time, master, date, time) VALUES ('02:00:00', 'Lana', '2020-07-18', '15:00:00');
INSERT INTO cl (service_time, master, date, time) VALUES ('02:00:00', 'Lana', '2020-07-18', '16:45:00');
INSERT INTO cl (service_time, master, date, time) VALUES ('02:00:00', 'Alex', '2020-07-07', '20:00:00');

Запрос:

Для того, что бы проверить пострадала ли логическая ценность таблицы, нужен запрос который бы возвращал из таблицы строки в которых time+service_time было бы меньше, чем следующее time на этот же день, для этого же мастера.

Пример ответа для хранимых данных указанных выше:

| service_time | master | date       | time     |
| 02:00:00     | Lana   | 2020-07-18 | 14:30:00 |
| 02:00:00     | Lana   | 2020-07-18 | 15:00:00 |
| 02:00:00     | Lana   | 2020-07-18 | 16:45:00 |

Ответы (1 шт):

Автор решения: Akina

я с легкостью адаптирую код в версиях 8.0 и старше, под то, что мне нужно

Да не вопрос.

WITH
cte AS ( SELECT *,
                TIMESTAMP(`date`, `time`) start_datetime, 
                TIMESTAMP(CONCAT(`date`, ' ', `time`), service_time) final_datetime
         FROM cl )
SELECT DISTINCT t1.ID_client
FROM cte t1, cte t2
WHERE t1.start_datetime < t2.final_datetime
  AND t2.start_datetime < t1.final_datetime
  AND t1.master = t2.master
  AND t1.ID_client != t2.ID_client;

fiddle

Вместо ID_client можно вывести любые поля - как исходные, так и расчётные.

→ Ссылка