MySQL: проверьте, содержится ли значение в интервале диапазона - PullRequest
3 голосов
/ 09 августа 2011

Мне было интересно, можно ли проверить, содержится ли строковое значение в столбце, учитывая, что столбец содержит начальное и конечное значения.

Например: если в таблице есть столбец NR сследующие строки:

400-500
45-76,23-25 ​​
12,14-19,21

Я хочу найти строку, которая имеетзначение 421 в нем.Поэтому ответ должен быть в первой строке.

Возможно ли это в mysql?

Ответы [ 2 ]

2 голосов
/ 09 августа 2011

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

CREATE TABLE foo (
    foo_id INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
    PRIMARY KEY (foo_id)
)
ENGINE=InnoDB;

CREATE TABLE foo_range (
    foo_id INT(10) UNSIGNED NOT NULL,
    column_from INT(10) UNSIGNED NOT NULL,
    column_to INT(10) UNSIGNED NOT NULL,
    INDEX foo_range_fk1 (foo_id),
    CONSTRAINT foo_range_fk1 FOREIGN KEY (foo_id) REFERENCES foo (foo_id)
)
ENGINE=InnoDB;

INSERT INTO foo(foo_id)
VALUES (1), (2), (3);

INSERT INTO foo_range(foo_id, column_from, column_to)
VALUES (1, 400, 500), (2, 45, 74), (2, 23, 25), (3, 12, 14), (3, 19, 21);

SELECT foo_id
FROM foo_range
WHERE 421 BETWEEN column_from AND column_to;

И, фактически, главная таблица даже не нужна, если вы не хотите хранить дополнительные данные:)

Если выЗастряв в другом дизайне БД, вам, вероятно, придется извлечь все строки и использовать язык клиентской части для сопоставления.

0 голосов
/ 09 августа 2011

Я согласен с приведенными выше комментариями. Добавьте два столбца в вашу таблицу и обновите ее с помощью функции substring_index ()

update table
set lft_value = substring_index(value,'-',1),
rgt_value = substring_index(value,'-',-1) 

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

редактировать. При сохранении структуры таблицы запрос будет выглядеть так:

select * from table
where 421 between
substring_index(value,'-',1),
and substring_index(value,'-',-1) 

но мне не нравится это решение.

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