Selecione as últimas N linhas do MySQL

121

Quero selecionar as últimas 50 linhas do banco de dados MySQL na coluna chamada id, que é a chave primária . O objetivo é que as linhas sejam classificadas por id na ordem ASC , é por isso que esta consulta não está funcionando

SELECT 
    *
FROM
    `table`
ORDER BY id DESC
LIMIT 50;

Também é notável que as linhas possam ser manipuladas (excluídas) e é por isso que a consulta a seguir também não está funcionando

SELECT 
    *
FROM
    `table`
WHERE
    id > ((SELECT 
            MAX(id)
        FROM
            chat) - 50)
ORDER BY id ASC;

Pergunta : Como é possível recuperar as últimas N linhas do banco de dados MySQL que podem ser manipuladas e estar na ordem ASC?

nanobash
fonte

Respostas:

236

Você pode fazer isso com uma subconsulta:

SELECT * FROM (
    SELECT * FROM table ORDER BY id DESC LIMIT 50
) sub
ORDER BY id ASC

Isso selecionará as últimas 50 linhas tablee as ordenará em ordem crescente.

mobília nova
fonte
5
^ Para sua informação, sei que este artigo é sobre MySQL, mas gostaria de informar que, em resposta ao comentário de @ DiegoDD acima, omitir o select externo e o alias não parece funcionar no Postgres (9.3.5). Recebo um 'Erro: várias cláusulas ORDER BY não permitidas'. A resposta aceita, no entanto, funciona conforme o esperado no Postgres
allenwlee de
Obrigado por isso! Esta consulta me ajudou a resolver meu problema. Estou procurando por isso há horas
Arshad
1
Como posso aplicar esta consulta com JOINS?
GYaN
@GYaN adiciona junções na subconsulta interna
sheikh hamza
9
SELECT * FROM table ORDER BY id DESC,datechat desc LIMIT 50

Se você tem um campo de data que armazena a data (e hora) em que o chat foi enviado ou qualquer campo que é preenchido de forma incremental (ordenar por DESC) ou desinscrementalmente (ordenar por ASC) dados por linha, coloque-o como segunda coluna em quais os dados devem ser ordenados.

Isso é o que funcionou para mim !!!! espero que ajude !!!!

amável
fonte
7
SELECT * FROM table ORDER BY id DESC LIMIT 50

economize recursos faça uma consulta, não há necessidade de fazer consultas aninhadas

Zumbido
fonte
1
Sua consulta retornará os resultados ao contrário (id decrescente). A consulta de @novafurniturey obterá as ÚLTIMAS linhas inseridas ( LIMITing no id decrescente), e o resultado final terá ids crescentes.
Robin Kanters
1
Sua solução não obterá os resultados na ordem certa, em vez disso, ela os obterá ao contrário, portanto, a necessidade de outra ordem para colocá-los na ordem certa novamente
Cobra47
1
Mas então você apenas faz um php array_reverse () ou qualquer equivalente em sua linguagem de script de escolha. O banco de dados não precisa fazer esse trabalho.
Joe
6
@Joe Não há nada na pergunta que indique que uma linguagem de script está sendo usada, então essa não é uma suposição segura a se fazer.
Nick Coons
A resposta esperada já deve ser classificada usando apenas a consulta do banco de dados.
d4ryl3
-2
select * from Table ORDER BY id LIMIT 30

Notas: * iddeve ser único. * Você pode controlar o número de linhas retornadas substituindo o 30na consulta

Darshan
fonte
1
Você poderia explicar sua solução? A explicação entre colchetes parece ser código, coloque uma frase inteira acima / abaixo do seu código. Obrigado
deHaar