MySQL: выберите диапазон упорядоченных записей на основе типа разделителя - PullRequest
0 голосов
/ 01 ноября 2011

У меня есть набор записей, и я хочу получить набор записей между двумя записями одного типа.

Рассмотрим этот пример данных:

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

Я хочуполучить записи из определенного разделителя в следующий разделитель или в конец набора записей.

Случаи :

  1. Начиная с записи 2, я ожидаючтобы получить записи 4 и 3.
  2. Начиная с записи 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

1 Ответ

1 голос
/ 02 ноября 2011

Я думаю, что это решает второй случай так же, как и первый:

SELECT *
FROM table_name
WHERE position > 8
AND 
( position < (
    SELECT MIN(position)
    FROM table_name
    WHERE position > 8
    AND type = 'separator'
) OR 
  position <= (SELECT MAX(position) FROM table_name) 
)
ORDER BY position ASC

Конечно, вы можете сначала вычислить MAX (ID) и вставить как константу.Предложение OR, вероятно, снизит производительность, поэтому я бы не стал использовать его, если бы работал с большими наборами данных, поскольку второй случай - уникальное исключение из SQL, решающего первый случай.

...