У меня есть таблица т:
id, timestamp
Существует несколько значений идентификатора, и несколько строк могут иметь один и тот же идентификатор.
Я хочу выбрать самую последнюю строку для каждого идентификатора до даты x, только если идентификатор не найден после даты x, а идентификатор также не найден в таблице y.
Я могу выбрать все до даты x, в этом примере :date=5 :
SELECT * FROM t WHERE timestamp < :date
Я попытался получить только самый последний идентификатор, не получая самого последнего, но возвращая 1 строку для каждого идентификатора:
SELECT * FROM t WHERE timestamp < :date GROUP BY id ORDER BY timestamp DESC
Я обеспокоен тем, что GROUP BY замедлит работу с большим количеством данных.
Вот некоторые примеры данных БД:
CREATE TABLE IF NOT EXISTS `t` (
`id` int(2) NOT NULL,
`timestamp` int(2) NOT NULL
)
INSERT INTO `t` (`id`, `timestamp`) VALUES
(1, 1),
(1, 4),
(2, 3),
(2, 1),
(2, 6),
(3, 4),
(3, 2);
CREATE TABLE IF NOT EXISTS `y` (
`id` int(2) NOT NULL,
`timestamp` int(2) NOT NULL
)
INSERT INTO `y` (`id`, `timestamp`) VALUES
(3, 1);
Глядя на возврат строки (1,4) только...
Спасибо!
SELECT * FROM t WHERE timestamp < :date-- для чего:dateваш пример? - person Ben Lee   schedule 09.12.2011