Как в таблице ниже получить только самую последнюю запись на 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 |
+----+---------------------+---------+
SELECT id, MAX(signin) FROM tbl GROUP BY id WHERE id=1;
USING
вместо явногоON
. Вы получили +1 :)SELECT * FROM tbl WHERE id = 1 ORDER BY signin DESC LIMIT 1;
Очевидный показатель будет на
(id)
, или индекс многоколончатого на(id, signin DESC)
.Для удобства MySQL отсортировывает
NULL
значения последними в порядке убывания. Это то, что вы обычно хотите, если могут бытьNULL
значения: строка с последним ненулевым значениемsignin
.Чтобы
NULL
сначала получить значения:Связанный:
Стандарт SQL явно не определяет порядок сортировки
NULL
значений по умолчанию . Поведение довольно сильно различается в разных СУБД. Видеть:Но есть в
NULLS FIRST
/NULLS LAST
положении , определенное в стандарте SQL и поддерживается большинство основной СУБД, но не MySQL. Видеть:источник
SELECT TOP 1 *
и удалитеLIMIT 1
последнюю строку. при использовании SQL Server. Используйте указанное выше, если MySQL или Postgres.Основываясь на ответе @ 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)
источник
Select [insert your fields here] from tablename where signin = (select max(signin) from tablename where ID = 1)
источник
SELECT * FROM (SELECT * FROM tb1 ORDER BY signin DESC) GROUP BY id;
источник
У меня была аналогичная проблема. Мне нужно было получить последнюю версию перевода содержимого страницы, другими словами - получить ту конкретную запись, которая имеет наибольший номер в столбце версии. Поэтому я выбираю все записи, упорядоченные по версии, а затем беру первую строку из результата (с помощью предложения LIMIT).
SELECT * FROM `page_contents_translations` ORDER BY version DESC LIMIT 1
источник
Простой способ достичь
Я знаю, что это старый вопрос. Вы также можете сделать что-нибудь вроде
SELECT * FROM Table WHERE id=1 ORDER BY signin DESC
В приведенном выше примере запрос первой записи будет самой последней записью.
Только для одной записи вы можете использовать что-то вроде
SELECT top(1) * FROM Table WHERE id=1 ORDER BY signin DESC
Вышеуказанный запрос вернет только одну последнюю запись.
Ура!
источник