Я не могу придумать какой-либо «правильный» 1019 *, способ сделать это, проблема кажется слишком сложной, чтобы ее можно было решить в СУБД. Возможно, вам следует пересмотреть дизайн ваших таблиц, чтобы оптимизировать эту вещь.
К счастью, вы используете MySQL, а MySQL, будучи MySQL, приносит множество функций неортодоксального характера и сомнительных Прямая совместимость, но независимо, может выполнить работу.
MySQL позволяет вам перебирать содержимое таблицы, используя управляющие переменные, чтобы «делать заметки» и составлять алгоритм сортировки при выполнении SELECT.
Таким образом, вы можете сделать что-то вроде этого, чтобы выбрать список диапазонов, которые соответствуют вашим критериям:
-- note: variables are hard-typed
SET @i = '', @c = 0, @m = 0, @s = 0;
SELECT
`id`,
`start`,
`end`
FROM
(
SELECT
*,
@s `start`,
IF(`id` = @i AND `flag` AND @c >= 2 AND (`text` = 'TextZ' OR @m), `sequence`, 0) `end`,
@s := IF(`flag`, `sequence`, IF(`id` <> @i, 0, @s)) `unused1`,
@m := IF(`text` = 'TextZ', 1, IF(`flag`, 0, @m)) `unused2`,
@c := IF(`id` = @i, IF(`flag`, 0, @c + 1), 0) `unused3`,
@i := `id` `unused4`
FROM `t`
) `a` WHERE `end` <> 0;
Вот функциональный пример для тестирования и просмотра: http://sqlfiddle.com/#! 9 / 95f2b / 3
И запрос, который выбирает допустимые диапазоны: http://sqlfiddle.com/#! 9 / 95f2b / 6