it-swarm-pt.tech

MySQL: obtenha o registro mais recente

Na tabela abaixo, como obtenho apenas o registro mais recente de id=1 baseado na coluna de login e não em todos os 3 registros?

+----+---------------------+---------+
| 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    |
+----+---------------------+---------+
65
enchance

Use o agregado MAX(signin) agrupado por id. Isto irá listar o signin mais recente para cada id.

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

Para obter o registro único inteiro, execute um INNER JOIN em uma subconsulta que retorne apenas MAX(signin) por 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
65
Michael Berkowski
SELECT *
FROM   tbl
WHERE  id = 1
ORDER  BY signin DESC
LIMIT  1;

O índice óbvio estaria em (id) ou em índice de várias colunas em (id, signin DESC).

Convenientemente, para o caso, o MySQL classifica os valores NULL por último em ordem decrescente. Isso é o que você normalmente quer se puder haver valores NULLname__: a linha com o mais recente signinnão-nulo.

Para obter os valores de NULLprimeiro:

ORDER BY signin IS NOT NULL, signin DESC

Relacionado:

O padrão SQL não define explicitamente uma ordem de classificação padrão para os valores NULLname__. O comportamento varia bastante em diferentes RDBMS. Vejo:

Mas lá são as cláusulas NULLS FIRST/NULLS LAST definidas no padrão SQL e suportadas pela maioria dos RDBMS principais, mas não pelo MySQL. Vejo:

66
Erwin Brandstetter

Baseando-se nas respostas do @xQbert, você pode evitar a subconsulta E torná-la genérica o suficiente para filtrar por qualquer ID

SELECT id, signin, signout
FROM dTable
INNER JOIN(
  SELECT id, MAX(signin) AS signin
  FROM dTable
  GROUP BY id
) AS t1 USING(id, signin)
8
rantsh
Select [insert your fields here]
from tablename 
where signin = (select max(signin) from tablename where ID = 1)
3
xQbert
SELECT * FROM (SELECT * FROM tb1 ORDER BY signin DESC) GROUP BY id;
1
user3044573

Eu tive um problema parecido. Eu precisava para obter a última versão da tradução do conteúdo da página, em outras palavras - para obter esse registro específico que tem o maior número na coluna de versão. Por isso, seleciono todos os registros ordenados por versão e, em seguida, pego a primeira linha do resultado (usando a cláusula LIMIT).

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