Eu tenho uma consulta que se parece com isso:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
Como o ORDER BY funciona? Ele ordenará todos os registros e, em seguida, obterá os 20 primeiros ou obterá 20 registros e os solicitará pelo publish_date
campo?
Se for o último, não há garantia de obter os 20 artigos mais recentes.
mysql
sql
sql-order-by
sql-limit
Alex
fonte
fonte
publish_date
s são iguais, a ordenação por eles não fornece resultados determinados, o que significa que, se você usarLIMIT
para paginação, poderá acabar recebendo os mesmos itens em páginas diferentes!Respostas:
Ele fará o pedido primeiro e, depois, o primeiro 20. Um banco de dados também processará qualquer coisa da
WHERE
cláusula anteriorORDER BY
.fonte
LIMIT
intervalosORDER BY
. ComLIMIT
umORDER BY
resultado errado retorna.LIMIT
de alguma forma reordena o conjunto de resultados retornado porORDER BY
A cláusula LIMIT pode ser usada para restringir o número de linhas retornadas pela instrução SELECT. LIMIT usa um ou dois argumentos numéricos, que devem ser constantes inteiras não-negativas (exceto ao usar instruções preparadas).
Com dois argumentos, o primeiro argumento especifica o deslocamento da primeira linha a retornar e o segundo especifica o número máximo de linhas a serem retornadas. O deslocamento da linha inicial é 0 (não 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Para recuperar todas as linhas de um determinado deslocamento até o final do conjunto de resultados, você pode usar um número grande para o segundo parâmetro. Esta instrução recupera todas as linhas da 96a linha até a última:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
Com um argumento, o valor especifica o número de linhas a serem retornadas desde o início do conjunto de resultados:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
Em outras palavras, LIMIT número_de-linha é equivalente a LIMIT 0, número-de-linha.
Todos os detalhes em: http://dev.mysql.com/doc/refman/5.0/en/select.html
fonte
Assim como @James diz, ele ordenará todos os registros e obterá as primeiras 20 linhas.
Sendo assim, você garante os 20 primeiros artigos publicados, os mais novos não serão exibidos.
Em sua situação, eu recomendo que você adicionar
desc
paraorder by publish_date
, se quiser que os artigos mais recentes, em seguida, o mais novo artigo vai ser o primeiro.Se você precisar manter o resultado em ordem crescente, e ainda desejar apenas os 10 artigos mais recentes, pode solicitar ao mysql que classifique o resultado duas vezes.
Esta consulta abaixo classificará o resultado decrescente e limitará o resultado a 10 (que é a consulta entre parênteses). Ele ainda será classificado em ordem decrescente, e não estamos satisfeitos com isso, então pedimos ao mysql para classificá-lo mais uma vez. Agora temos o resultado mais recente na última linha.
Se você precisar de todas as colunas, isso é feito da seguinte maneira:
Eu uso essa técnica quando escrevo manualmente consultas para examinar o banco de dados em busca de várias coisas. Eu não o usei em um ambiente de produção, mas agora, quando eu o marquei, a classificação extra não afeta o desempenho.
fonte
Se houver um índice adequado, neste caso no
publish_date
campo, o MySQL não precisará varrer o índice inteiro para obter os 20 registros solicitados - os 20 registros serão encontrados no início do índice. Mas se não houver um índice adequado, será necessária uma varredura completa da tabela.Existe um artigo do MySQL Performance Blog de 2009 sobre isso.
fonte
Você pode adicionar [asc] ou [desc] no final do pedido para obter os registros mais antigos ou mais recentes
Por exemplo, isso fornecerá os registros mais recentes primeiro
Anexe a
LIMIT
cláusula apósORDER BY
fonte
Você pode usar este código em
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
que 0 é um limite inicial de registro e 10 número de registrofonte
LIMIT 10
é uma abreviação deLIMIT 0,10
.LIMIT é normalmente aplicado como a última operação, portanto o resultado será classificado primeiro e depois limitado a 20. Na verdade, a classificação será interrompida assim que os primeiros 20 resultados classificados forem encontrados.
fonte
Também a sintaxe de LIMIT é diferente de acordo com os bancos de dados, por exemplo:
mysql
- LIMITE 1, 2postgres
- LIMITE 2 OFFSET 1fonte