Это может быть излишним, но вы можете использовать JOINs, как показано ниже, чтобы не только знать, есть ли перекрытие, но и что перекрывается:
SELECT t.id, tOther.id As overlappingId
FROM t
LEFT JOIN t AS tOther
ON t.id <> tOther.id -- Not the same record
AND t.min_val < tOther.max_val -- Starts before "other" ends
AND t.max_val > tOther.min_val -- Ends after "other" starts
;
Если вам нужна только одна строка результата на t
, запрос можно настроить с агрегацией.
SELECT t.id
, COUNT(tOther.id) AS overlappingCount -- Count ignores null values
, GROUP_CONCAT(tOther.id) AS overlappingIDs -- Will be null if no overlaps
FROM t
LEFT JOIN t AS tOther
ON t.id <> tOther.id -- Not the same record
AND t.min_val < tOther.max_val -- Starts before "other" ends
AND t.max_val > tOther.min_val -- Ends after "other" starts
GROUP BY t.id
;
Если вы считаете общую границу перекрывающейся, просто измените >
и <
на >=
и <=
соответственно.