MySQL: получить самую последнюю запись - PullRequest
66 голосов
/ 15 декабря 2011

В таблице ниже, как получить только самую последнюю запись из 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    |
+----+---------------------+---------+

Ответы [ 6 ]

67 голосов
/ 15 декабря 2011
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. См:

66 голосов
/ 15 декабря 2011

Использовать совокупность MAX(signin), сгруппированную по id.Это будет список самых последних signin для каждого id.

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

. Чтобы получить всю отдельную запись, выполните INNER JOIN для подзапроса, который возвращает только MAX(signin) для идентификатора.

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
9 голосов
/ 13 марта 2013

Опираясь на ответы @ 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)
3 голосов
/ 15 декабря 2011
Select [insert your fields here]
from tablename 
where signin = (select max(signin) from tablename where ID = 1)
1 голос
/ 20 февраля 2018

У меня была похожая проблема.Мне нужно было получить последнюю версию перевода содержимого страницы, другими словами - получить ту конкретную запись, которая имеет наибольшее число в столбце версии.Поэтому я выбираю все записи, упорядоченные по версии, а затем беру первую строку из результата (с помощью предложения LIMIT).

SELECT *
FROM `page_contents_translations`
ORDER BY version DESC
LIMIT 1
1 голос
/ 17 ноября 2014
SELECT * FROM (SELECT * FROM tb1 ORDER BY signin DESC) GROUP BY id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...