2014-12-29 2 views
1

У меня есть таблица, например, так:Эффективно выбрать строку DB, помеченный как «последней версии», и в то время как соответствующий заданный интервал

id min max version data 
1  1  10  1   a 
2 11  20  1   b 
3 21  30  1   c 

4  1  10  2   a 
5 11  20  2   b 
6 21  30  2   c 

мин, макс представляют значения key. Каждая строка (min, max) в данной версии гарантированно имеет взаимоисключающие ключевые интервалы.

Предположим, что у меня есть ключевое значение 5, которое и я хочу получить последнюю версию данных для этого ключа. Это означает, что я хочу выбрать строку с id = 4.

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

То, что я сейчас это:

select * from range_table where 5 between `min` and `max` and ver = 2; 

Вопрос: есть способ, чтобы автоматически выбрать максимальную версию (не более вер), без указания его в явном виде? (Под «эффективно» Я имею в виду, не рассматривая все таблицы строк.)

воссоздавать Таблица

drop table range_table; 
CREATE TABLE `range_table` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `min` int(11) NOT NULL, 
    `max` int(11) NOT NULL, 
    `ver` int(11) NOT NULL default 1, 
    `data` CHAR NOT NULL, 

    PRIMARY KEY (`id`), 
    unique key ver_min_max(ver, `min`, `max`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

insert into range_table (`min`,`max`, ver, data) values 
(1, 10, 1, 'a'), 
(11, 20, 1, 'b'), 
(21, 30, 1, 'c'), 
(1, 10, 2, 'a'), 
(11, 20, 2, 'b'), 
(21, 30, 2, 'd'); 
+0

Что неэффективен об одном у вас есть? – AdamMc331

+1

Я не уверен, правильно ли я понял, но с ключом 5 в соответствии с запросом означает, что будет строка с id = 4, а не id = 6? –

+0

спасибо, исправлено! – Dennis

ответ

1

Вы можете взять первую строку заказанной версии убывания ...

select * from range_table where 5 between `min` and `max` order by ver desc limit 1; 
0

Если вы заботитесь о производительности, то, в зависимости от размера и/или селективности столбцов, вы можете добавить индекс в столбец min или max. Если количество версий остается низким для каждого min-max, ваш запрос будет оптимизирован.

0

Пожалуйста, попробуйте сделать следующее, чтобы выбрать всегда последнюю версию

select * from range_table where @key between `min` and `max` and ver = (select max (a.ver) as max_ver from range_table as a where @key between a.`min` and a.`max`) 

где @key бы данное ключевое значение.

 Смежные вопросы

  • Нет связанных вопросов^_^