Me gustaría construir una consulta que muestre todos los resultados en una tabla, pero que esté compensada por 5 desde el inicio de la tabla. Por lo que puedo decir, MySQL LIMIT
requiere un límite y una compensación. ¿Hay alguna forma de hacer esto?
114
limit 5000, 18446744073709551615
. No va a obtener 5000 filas adicionales solo para que su código se vea bonito.Respuestas:
Del manual de MySQL en LIMIT :
fuente
Limit -1
o seLimit Null
ven bastante razonables! o al menos Limit debería aceptar una subconsulta comoselect * from table limit (select count(*) from table)
Como mencionaste, se requiere LIMIT, por lo que debes usar el límite más grande posible, que es 18446744073709551615 (máximo de BIGINT sin firmar)
fuente
Como se señaló en otras respuestas, MySQL sugiere usar 18446744073709551615 como el número de registros en el límite, pero considere esto: ¿Qué haría si recuperara 18,446,744,073,709,551,615 registros? De hecho, ¿qué harías si obtuvieras 1,000,000,000 de registros?
Tal vez desee más de mil millones de registros, pero mi punto es que hay un límite en el número que desea , y es menos de 18 quintillones. En aras de la estabilidad, la optimización y posiblemente la usabilidad, sugeriría poner un límite significativo a la consulta. Esto también reduciría la confusión para cualquiera que nunca haya visto ese número de aspecto mágico y tendría el beneficio adicional de comunicar al menos cuántos registros está dispuesto a manejar a la vez.
Si realmente debe obtener los 18 trillones de registros de su base de datos, tal vez lo que realmente desee es capturarlos en incrementos de 100 millones y repetir 184 mil millones de veces.
fuente
Otro enfoque sería seleccionar una columna autoimcrementada y luego filtrarla usando HAVING.
Pero probablemente me quedaría con el enfoque de límite alto.
fuente
$sql = 'SET @a :=0 SELECT .....';
Como otros mencionaron, del manual de MySQL. Para lograr eso, puede usar el valor máximo de un gran int sin firmar, que es este número terrible (18446744073709551615). Pero para hacerlo un poco menos complicado, puede utilizar el operador bit a bit tilde "~".
funciona como una negación bit a bit. El resultado de "~ 0" es 18446744073709551615.
fuente
LIMIT 5, ~0
LIMIT ~0 OFFSET 5
Justo hoy estaba leyendo sobre la mejor manera de obtener grandes cantidades de datos (más de un millón de filas) de una tabla mysql. Una forma es, como se sugiere, usar
LIMIT x,y
dóndex
está el desplazamiento yy
la última fila que desea devolver. Sin embargo, como descubrí, no es la forma más eficiente de hacerlo. Si tiene una columna de autoincremento, puede usar fácilmente unaSELECT
declaración con unaWHERE
cláusula que diga desde qué registro le gustaría comenzar.Por ejemplo,
SELECT * FROM table_name WHERE id > x;
Parece que mysql obtiene todos los resultados cuando lo usa
LIMIT
y luego solo le muestra los registros que encajan en el desplazamiento: no es el mejor para el rendimiento.Fuente: Respuesta a esta pregunta Foros de MySQL . Solo tome nota, la pregunta tiene aproximadamente 6 años.
fuente
Puede usar una declaración de MySQL con LIMIT:
Probado en MySQL 5.5.44. Así, podemos evitar la inserción del número 18446744073709551615.
nota: la transacción asegura que la variable @rows esté de acuerdo con la tabla considerada en la ejecución de la sentencia.
fuente
Sé que esto es antiguo, pero no vi una respuesta similar, así que esta es la solución que usaría.
Primero, ejecutaría una consulta de recuento en la tabla para ver cuántos registros existen. Esta consulta es rápida y normalmente el tiempo de ejecución es insignificante. Algo como:
Luego, construiría mi consulta usando el resultado que obtuve del recuento como mi límite (ya que ese es el número máximo de filas que la tabla podría devolver). Algo como:
O posiblemente algo como:
Por supuesto, si es necesario, puede restar deseado_desplazamiento de count_result para obtener un valor real y exacto para suministrar como límite. Pasar el valor "18446744073709551610" simplemente no tiene sentido si realmente puedo determinar un límite apropiado para proporcionar.
fuente
id puede ser cualquier columna numérica única o autoincrementada que tenga ...
fuente