2013-07-05 3 views
0

Здесь я создал некоторые таблицы для проверки с:SQL: Возьмите только последнюю запись для каждой «группы»?

CREATE TABLE IF NOT EXISTS `test` (
    `index` varchar(255) NOT NULL, 
    `index2` varchar(255) NOT NULL, 
    `date` date NOT NULL, 
    `somenumber` int(10) NOT NULL, 
    PRIMARY KEY (`index`,`index2`,`date`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `test` (`index`, `index2`, `date`, `somenumber`) VALUES 
('kevin', 'little', '2013-06-11', 1), 
('kevin', 'little', '2013-07-03', 5), 
('maria', 'smith', '2013-07-01', 3), 
('martin', 'luther', '2013-07-04', 13), 
('martin', 'luther', '2013-07-05', 14); 

Теперь я хочу, чтобы получить последнююsomenumber для всех, заказанный somenumber DESC. Вот моя попытка:

SELECT * FROM `test` GROUP BY `index`, `index2` ORDER BY `somenumber` DESC 

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

(я знаю, что indexnames не делать слишком много смысла, но я думал, что это будет пример проще для чтения, чем при использовании случайных чисел-индексов)

+0

если и хотят, последняя запись, вставляемой, shudnt у просто оставить его как 'ORDER BY somenumber;' – kevinm

+0

Вы имеете в виду последнее по дате? – Headshota

+0

Да, мне нужен последний номер для всех, где «последний» определяется строкой 'date'. – user2015253

ответ

2

Попробуйте это:

SELECT t1.`INDEX`, t1.`INDEX2`, t1.`SOMENUMBER` FROM TEST t1 INNER JOIN 
(SELECT `INDEX`, `INDEX2`, MAX(`DATE`) DATE FROM TEST 
GROUP BY `INDEX`, `INDEX2`) t2 ON t1.INDEX = t2.INDEX AND t1.INDEX2 = t2.INDEX2 AND t1.DATE = t2.DATE 
+0

'# 1052 - Столбец« ИНДЕКС »в списке полей неоднозначен' – user2015253

+0

Отредактировано ответ – Mikhail

+0

@ user2015253: Это правильный ответ. – eggyal

3

Надеется, что это поможет вам

SELECT * 
FROM 
    (SELECT * FROM `test` ORDER BY `index`, `date` DESC) as temp 
GROUP BY `index`, `index2` 
ORDER BY `somenumber` DESC 
+0

В внешнем запросе «[сервер может выбирать любое значение из каждой группы, поэтому, если они не совпадают, выбранные значения неопределены] (http://dev.mysql.com/doc/en/group- по-extensions.html)». – eggyal

+0

В внешнем запросе сервер выберет первое значение для каждой группы. Поскольку строки сортируются по «ORDER BY' index', 'date' DESC», поэтому он будет иметь самую новую строку. – agarici

+0

Просьба пояснить, как вы определили, что «сервер будет выбирать первое значение для каждой группы», если в документации указано иное? Пожалуйста, объясните, как вы определили, что такое «первое значение», когда в документации нет утверждений о переносе заказа из материализованных таблиц в родительские запросы? – eggyal

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