У меня есть таблица с записями, представляющими журнал, в этом примере я опускаю остальные столбцы.
Столбец id
является автоинкрементным, item_id
представляет элемент в приложении.
Мне нужно получить последние item_id
, например два или три
CREATE TABLE "log" (
"id" INT,
"item_id" INT
);
-- TRUNCATE TABLE "log";
INSERT INTO "log" ("id", "item_id") VALUES
(1, 1),
(2, 2),
(3, 1),
(4, 1),
(5, 3),
(6, 3);
Базовый запрос отобразит все результаты, самые последние вверху:
SELECT *
FROM "log"
ORDER BY "id" DESC
id item_id
6 3
5 3
4 1
3 1
2 2
1 1
Я хотел бы иметь только два (LIMIT 2) последних item_id с их идентификатором. Последний означает - вставлен последним (ORDER BY id).
id item_id
6 3
4 1
Последние три будут
id item_id
6 3
4 1
2 2
Как только возвращается item_id
, он больше не возвращается. Таким образом, LIMIT 4
вернет только три строки, потому что существует только три уникальных item_id
.
Я, наверное, что-то упускаю. Я уже пробовал разные комбинации DISTINCT OF
, GROUP BY
, LIMIT
и т.д.
ОБНОВЛЕНИЕ #1: После того, как я протестировал запрос S-man (ниже), я обнаружил, что он работает для данных, которые я предоставил, однако он не работает в целом для другого набора данных (последовательность item_id
А, Б и снова А.). Вот еще набор данных:
TRUNCATE TABLE "log";
INSERT INTO "log" ("id", "item_id") VALUES
(1, 1),
(2, 2),
(3, 3),
(4, 3),
(5, 1),
(6, 3);
Данные в БД, упорядоченные по id
desc:
id item_id
6 3
5 1
4 3
3 3
2 2
1 1
Ожидаемый результат для последних трех item_id
6 3
5 1
2 2