Dimka, не хочу спорить.
Лишь прошу автора топика протестировать все три варианта запроса и выдать все возможные параметры выполнения: время, ЦП, IO
с указанием кол-ва записей в исходной таблице (это немало важный показатель)
уже самому интересно кто прав, а то может точно мне надо пойти учить мат.часть
Ваш запрос интересен, но в моей БД исключены дублирование записей в таблице prds. Я использую сейчас оба запроса (от RXL и Dimka). По моим тестам запрос RXL выигрывает в скорости в разы. Но второй запрос мне нужен для вывода других данных. По Вашей просьбе вот результаты запросов:) В таблице 1090 записей.
select t1.date `from`, t2.date `to`, t2.id_work `id_work`
from (select 0 n union select 1 union select 2) seq, prds t1, prds t2
where t1.id_work=t2.id_work and t2.date=t1.date+interval seq.n day and t1.allo>0 and t2.allo>0
group by t2.date, t2.id_work having count(t2.date)=3;
#Отображает строки 0 - 29 ( 495 всего, Запрос занял 0.0240 сек.)
select min(t2.date) `from`, max(t2.date) `to`, t2.id_work `id_work`
from prds t1 join prds t2 on t1.allo>0 and t2.allo>0 and t2.date between t1.date and date_add(t1.date,interval 2 day)
group by t1.date, t2.id_work having count(distinct t2.date)=3;
#Отображает строки 0 - 29 ( 495 всего, Запрос занял 0.2913 сек.)
select t.date+interval seq.n-2 day `from`, t.date+interval seq.n day `to`, t.id_work `id_work`
from prds t, (select 0 n union select 1 union select 2) seq
group by t.date+interval seq.n-2 day, t.date+interval seq.n day, t.id_work
having sum(case when t.allo=0 then 1 else 0 end)=0 and count(distinct t.date)=3;
#Отображает строки 0 - 29 ( 495 всего, Запрос занял 0.0146 сек.)
Получается третий вариант побыстрее будет, хотя в продакшене при добавлении других частей запроса (другие условия), почему то проигрывает, но это буду уже сам разбираться)
Тут ещё используется только один раз таблица с периодами. и возможна защита от повторения записей.
Буду исследовать запрос.
HandKot, спасибо).