Подтвердить что ты не робот

MySQL: получите самую последнюю запись

В следующей таблице, как получить только самую последнюю запись id=1 на основе столбца signin и не всех 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    |
+----+---------------------+---------+
4b9b3361

Ответ 1

Используйте агрегат MAX(signin), сгруппированный по идентификатору. При этом будет отображаться последний 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

Ответ 2

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. См:

Ответ 3

Основываясь на ответе @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)

Ответ 4

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

Ответ 5

SELECT * FROM (SELECT * FROM tb1 ORDER BY signin DESC) GROUP BY id;

Ответ 6

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

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

Ответ 7

Простой способ достичь

Я знаю это старый вопрос Вы также можете сделать что-то вроде

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

В приведенном выше запросе первая запись будет самой последней.

Только для одной записи вы можете использовать что-то вроде

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

Приведенный выше запрос вернет только одну последнюю запись.

Ура!