У меня есть таблица, например, так:Эффективно выбрать строку 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');
Что неэффективен об одном у вас есть? – AdamMc331
Я не уверен, правильно ли я понял, но с ключом 5 в соответствии с запросом означает, что будет строка с id = 4, а не id = 6? –
спасибо, исправлено! – Dennis