Tengo una consulta que se ve así:
SELECT article FROM table1 ORDER BY publish_date LIMIT 20
¿Cómo funciona ORDER BY? ¿Ordenará todos los registros, luego obtendrá los primeros 20, o obtendrá 20 registros y los ordenará por publish_date
campo?
Si es el último, no se garantiza que realmente obtenga los 20 artículos más recientes.
mysql
sql
sql-order-by
sql-limit
Alex
fuente
fuente
publish_date
s son iguales, ordenar por ellos no da resultados determinados, lo que significa que si los usaLIMIT
para paginar, ¡puede terminar obteniendo los mismos artículos en diferentes páginas!Respuestas:
Primero ordenará, luego obtendrá los primeros 20. Una base de datos también procesará cualquier cosa en la
WHERE
cláusula anteriorORDER BY
.fuente
LIMIT
se rompeORDER BY
. ConLIMIT
unORDER BY
resultado incorrecto devuelve.LIMIT
de alguna manera reordena el conjunto de resultados devuelto porORDER BY
La cláusula LIMIT puede usarse para restringir el número de filas devueltas por la instrucción SELECT. LIMIT toma uno o dos argumentos numéricos, que deben ser constantes enteras no negativas (excepto cuando se usan declaraciones preparadas).
Con dos argumentos, el primer argumento especifica el desplazamiento de la primera fila para devolver, y el segundo especifica el número máximo de filas para devolver. El desplazamiento de la fila inicial es 0 (no 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Para recuperar todas las filas desde un cierto desplazamiento hasta el final del conjunto de resultados, puede usar un número grande para el segundo parámetro. Esta declaración recupera todas las filas desde la fila 96 hasta la última:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
Con un argumento, el valor especifica el número de filas a devolver desde el comienzo del conjunto de resultados:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
En otras palabras, LIMIT row_count es equivalente a LIMIT 0, row_count.
Todos los detalles en: http://dev.mysql.com/doc/refman/5.0/en/select.html
fuente
Tal como dice @James, ordenará todos los registros y luego obtendrá las primeras 20 filas.
Como es así, tiene la garantía de obtener los 20 primeros artículos publicados, los más nuevos no se mostrarán.
En su situación, recomiendo que se agrega
desc
aorder by publish_date
, si desea que los artículos más nuevos, a continuación, el artículo más reciente será la primera.Si necesita mantener el resultado en orden ascendente, y todavía quiere los 10 artículos más recientes, puede pedirle a mysql que clasifique su resultado dos veces.
Esta consulta a continuación ordenará el resultado descendente y limitará el resultado a 10 (esa es la consulta dentro del paréntesis). Todavía se ordenará en orden descendente, y no estamos satisfechos con eso, por lo que le pedimos a mysql que lo ordene una vez más. Ahora tenemos el resultado más nuevo en la última fila.
Si necesita todas las columnas, se hace de esta manera:
Utilizo esta técnica cuando escribo consultas manualmente para examinar la base de datos en busca de varias cosas. No lo he usado en un entorno de producción, pero ahora cuando lo marqué en el banco, la clasificación adicional no afecta el rendimiento.
fuente
Si hay un índice adecuado, en este caso en el
publish_date
campo, entonces MySQL no necesita escanear todo el índice para obtener los 20 registros solicitados; los 20 registros se encontrarán al comienzo del índice. Pero si no hay un índice adecuado, se necesitará un análisis completo de la tabla.Hay un artículo de MySQL Performance Blog de 2009 sobre esto.
fuente
Puede agregar [asc] o [desc] al final del pedido para obtener los registros más antiguos o más recientes
Por ejemplo, esto le dará primero los últimos registros
Añadir la
LIMIT
cláusula despuésORDER BY
fuente
Puede usar este código
SELECT article FROM table1 ORDER BY publish_date LIMIT 0,10
donde 0 es un límite de inicio de registro y 10 número de registrofuente
LIMIT 10
es la abreviaturaLIMIT 0,10
.LÍMITE generalmente se aplica como la última operación, por lo que el resultado primero se ordenará y luego se limitará a 20. De hecho, la clasificación se detendrá tan pronto como se encuentren los primeros 20 resultados ordenados.
fuente
Además, la sintaxis de LIMIT es diferente según las bases de datos, por ejemplo:
mysql
- LÍMITE 1, 2postgres
- LIMIT 2 OFFSET 1fuente