Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
set @start := X;
set @end := Y;
select * from tab
where greatest(start, @start) <= least(end, @end)
or ((end > @start or @end > start) and sign(start - end) <> sign(@start - @end))
or (end < start and @end < @start);
set @start := X;
set @end := Y;
select * from tab
where sin((start - @start)/4) * sin((start - @end)/4) * sin((end - @start)/4) * sin((end - @end)/4) <= 0Делитель 4 здесь для того, чтобы максимальный элемент множества не был бы больше два пи. В принципе, вместо четверки можно взять и 100 с запасом. Это решение лучше в том смысле, что оно получено не перечислением вариантов, а выведено из условия пересечения хорд.WHERE
NOT ( `start` >= @end OR `end` <= @start )WHERE
`start` < @end AND `end` > @start)Поверить в то, что это условие в самом деле ищет любое пересечение, очень непросто.
AND NOT (`prime_end`<= @start AND XOR @end <=`prime_start` )
set @start := X;
set @end := Y;
select * from tab
where (@start - start) * (start - @end) * (@start - @end) <= 0
or (@start - start) * (@start - end) * (start - end) >= 0;
Вычисление пересекающихся интервалов в линейных и замкнутых числовых полях