У меня есть набор записей, и я хочу получить набор записей между двумя записями одного типа.
Рассмотрим этот пример данных:
ID POSITION TYPE
9 1 separator
7 2 one
8 3 three
5 4 one
2 5 separator
4 6 two
3 7 two
6 8 separator
1 9 four
11 10 five
10 11 three
12 12 five
Я хочуполучить записи из определенного разделителя в следующий разделитель или в конец набора записей.
Случаи :
- Начиная с записи 2, я ожидаючтобы получить записи 4 и 3.
- Начиная с записи 6, я ожидаю получить записи 1, 11, 10 и 12.
Я могу решить Случай 1 с подзапросом, например:
SELECT *
FROM table_name
WHERE position > 5
AND position < (
SELECT MIN(position)
FROM table_name
WHERE position > 5
AND type = 'separator'
)
ORDER BY position ASC
Это решение не будет работать для Случай 2 , и, похоже, должен быть способ, который не используетподзапрос.
РЕШЕНИЕ
Мое решение основано на ответе Джорджа и работает, но меня беспокоит его потенциальная нехватка производительности из-зафункция объединения и подзапросы.
SELECT *
FROM table_name
WHERE `position` > 5
AND `position` < COALESCE(
(SELECT MIN(`position`)
FROM table_name
WHERE `position` > 5
AND `type` = 'separator'),
(SELECT MAX(`position`) + 1
FROM table_name))
ORDER BY `position` ASC