ну это почти то же самое.
1) находим пересекающиеся отрезки
2) выводим четыре точки min, middle1, middle2, max
точки min и middle1, а также middle2 и max теоретически могут совпадать — дальше уже скрипт должен решать сколько здесь диапазонов: возможно от 1 до 3
я немного наврал по поводу использования min() и max() — их нельзя использовать со значениями, только как аггрегатные, вместо этого есть
LEAST() - аналог min() в PHP
GREATEST() — аналог max() в PHP
SELECT a.id AS aid, b.id AS bid,
least(a.ip_from, b.ip_from) AS ip_min,
greatest(a.ip_from, b.ip_from) AS ip_middle1,
least(a.ip_to, b.ip_to) AS ip_middle2,
greatest(a.ip_to, b.ip_to) AS ip_max
FROM ranges AS a, ranges AS b
WHERE a.ip_from <= b.ip_to AND a.ip_to >= b.ip_from
Спустя 112 сек.
если надо выбрать только те пары, диапазоны, которые
бьются на три — делаем условие строже
[tt]a.ip_from < b.ip_to AND a.ip_to > b.ip_from[/tt]
ιιlllιlllι унц-унц