MySQL: Отримайте найновіший запис


80

У нижченаведеній таблиці, як отримати лише найновіший запис на id=1основі стовпця входу, а не всіх 3 записів?

+----+---------------------+---------+
| id | signin              | signout |
+----+---------------------+---------+
|  1 | 2011-12-12 09:27:24 | NULL    |
|  1 | 2011-12-13 09:27:31 | NULL    |
|  1 | 2011-12-14 09:27:34 | NULL    |
|  2 | 2011-12-14 09:28:21 | NULL    |
+----+---------------------+---------+

Відповіді:


90

Використовуйте агрегат, MAX(signin)згрупований за ідентифікатором. Тут буде перелічено найновіші signinдля кожного id.

SELECT 
 id, 
 MAX(signin) AS most_recent_signin
FROM tbl
GROUP BY id

Щоб отримати весь одиничний запис, виконайте INNER JOINпроти підзапиту, який повертає лише MAX(signin)per id.

SELECT 
  tbl.id,
  signin,
  signout
FROM tbl
  INNER JOIN (
    SELECT id, MAX(signin) AS maxsign FROM tbl GROUP BY id
  ) ms ON tbl.id = ms.id AND signin = maxsign
WHERE tbl.id=1

Ось що працювало на основі вашої першої відповіді:SELECT id, MAX(signin) FROM tbl GROUP BY id WHERE id=1;
enchance

Я намагався реалізувати 2-е рішення (щоб отримати весь рядок) на власній ситуації, але завжди отримую порожній набір результатів
rantsh

Відповідь @rantsh xQbert мала правильну версію того, що я мав спочатку, але я віддаю перевагу рішенню, яке я щойно змінив.
Michael Berkowski

@MichaelBerkowski ти мав на увазі, що віддаєш перевагу моєму рішенню? Я б не проти отримати відповідь на свою відповідь, якщо це так
Ранш

1
@rantsh Ах, я не помічав, що ти додав подібну річ до того, що я щойно модифікував, крім як через USINGзамість явного ON. Ви отримали +1 :)
Майкл Берковський

83
SELECT *
FROM   tbl
WHERE  id = 1
ORDER  BY signin DESC
LIMIT  1;

Очевидний індекс буде ввімкнено (id), або багатостолбковий індекс увімкнено (id, signin DESC).

Зручно для випадку, MySQL сортує NULLзначення останніми у порядку зменшення. Це те, що ти зазвичай хочеш, якщо можуть бути NULLзначення: рядок із останнім не нульовим значенням signin.

Щоб отримати NULLзначення спочатку:

ORDER BY signin IS NOT NULL, signin DESC

Пов’язані:

Стандарт SQL прямо не визначає порядок сортування NULLзначень за замовчуванням . Поведінка дуже різниться в різних СУБД. Подивитися:

Але є в NULLS FIRST/ NULLS LASTстановищі , певне в стандарті SQL і підтримується більшість основний СУБД, але не MySQL. Подивитися:


5
Це відчувається як найчистіший спосіб зробити це!
karancan

Подумайте про створення індексу для стовпця для входу, це значно прискорить процес
Олексій Теніцький

Використовуйте SELECT TOP 1 *та видаляйте LIMIT 1останній рядок. якщо використовується SQL Server. Використовуйте вищезазначене, якщо MySQL або Postgres.
jaredbaszler

Найчистіший. . . . . . . .
stigzler

Просто і чисто!
Jeremy Swagger

9

Спираючись на відповіді @ xQbert, ви можете уникнути підзапиту І зробити його достатньо загальним для фільтрації за будь-яким ідентифікатором

SELECT id, signin, signout
FROM dTable
INNER JOIN(
  SELECT id, MAX(signin) AS signin
  FROM dTable
  GROUP BY id
) AS t1 USING(id, signin)

Привіт, як працює цей запит і чи є він ефективнішим, ніж відповідь xQbert? Обидва запити виконуються приблизно в один і той же час для мене, і я не розумію, яка частина запиту використовує, замінюючи те, що зазвичай і ввімкнено.
ZJS

3
Select [insert your fields here]
from tablename 
where signin = (select max(signin) from tablename where ID = 1)


1

У мене була подібна проблема. Мені потрібно було отримати останню версію перекладу вмісту сторінки, іншими словами - отримати той конкретний запис, який має найбільший номер у стовпці версії. Тому я вибираю всі записи, упорядковані за версією, а потім беру перший рядок із результату (за допомогою речення LIMIT).

SELECT *
FROM `page_contents_translations`
ORDER BY version DESC
LIMIT 1

1

Простий спосіб досягти

Я знаю, це старе запитання. Ви також можете зробити щось подібне

SELECT * FROM Table WHERE id=1 ORDER BY signin DESC

Вище, запит першим записом буде останнім записом.

Тільки для одного запису ви можете використовувати щось на зразок

SELECT top(1) * FROM Table WHERE id=1 ORDER BY signin DESC

Вище запит поверне лише один останній запис.

Ура!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.