Как сделать выборку из таблицы с условием на совпадения в диапазоне?
Пролог:
Есть таблица в БД, с основными полями 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 шт):
я с легкостью адаптирую код в версиях 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;
Вместо ID_client можно вывести любые поля - как исходные, так и расчётные.