2009-11-19 14 views
6

¿Hay alguna manera en MySQL para COUNT(*) de una tabla donde si el número es mayor que x, dejará de contar allí? Básicamente, solo quiero saber si la cantidad de registros devueltos por una consulta es mayor o menor que un número en particular. Si es más que ese número, realmente no me importa cuántas filas hay, si es menor, dígame el recuento.Contar desde una tabla, pero dejar de contar en un cierto número

he sido capaz de eludir así:

-- let x be 100 

SELECT COUNT(*) FROM (
    SELECT `id` FROM `myTable` 
    WHERE myCriteria = 1 
    LIMIT 100 
) AS temp 

... pero me preguntaba si había alguna manera práctica incorporada para hacer esto?


Gracias por las sugerencias, pero debería haber sido más claro sobre los motivos de esta pregunta. Es seleccionar de un par de tablas unidas, cada una con decenas de millones de registros. La ejecución de COUNT(*) utilizando un criterio indexado aún demora aproximadamente 80 segundos, ejecutar una sin un índice toma aproximadamente 30 minutos más o menos. Se trata más de optimizar la consulta en lugar de obtener el resultado correcto.

+0

me temo que en este caso la comprobación para si COUNT()> 100 o COUNT()> 1000 o COUNT()> 10000 no hará ninguna diferencia. –

+0

sí lo sé, es por eso que estoy haciendo la sub consulta con LIMIT, me preguntaba si había una mejor manera de eliminar – nickf

+0

mi respuesta cuando vi su edición/intención. Supongo que su respuesta en su pregunta es la más óptima –

Respuesta

7
SELECT * FROM WhateverTable WHERE WhateverCriteria 
LIMIT 100, 1 

LIMIT 100, 1 devuelve el registro 101º, si lo hay, o no hay registro en caso contrario. Es posible que pueda utilizar la consulta anterior como una subconsulta en cláusulas EXIST, si eso le ayuda.

+0

Eso no me parece correcto. ¿No incluirá esto solo las identificaciones que se producen más de 100 veces? Si cada ID es única, ¡buena suerte con eso! –

+0

He editado la publicación. "HAVING" se usa junto con "GROUP BY" y "GROUP BY" no es necesario en este caso. –

+0

No. Ahora el SQL es sintácticamente incorrecto. –

1

No se me ocurre nada. Me parece que lo que estás haciendo cumple exactamente con el propósito, y SQL ciertamente no parece haber salido de su camino para facilitarte hacer esto de forma más sucinta.

Considera lo siguiente: lo que estás tratando de hacer no tiene sentido en un contexto estricto de aritmética de conjuntos. Matemáticamente, la respuesta es contar todo y luego tomar el MIN() con 100, que es lo que estás (pragmáticamente y con buena razón) tratando de evitar.

0

Esto funciona:

select count(*) from (select * from stockinfo s limit 100) s 

pero no fue más rápido (que pude ver) desde justo:

select count(*) from stockinfo 

que volvió 5170965.

+1

Del manual: COUNT (*) está optimizado para regresar rápidamente si SELECT recupera de una tabla, no se recuperan otras columnas y no hay una cláusula WHERE. Esta optimización solo se aplica a las tablas MyISAM, ya que se almacena un recuento exacto de filas para este motor de almacenamiento y se puede acceder a él muy rápidamente. – nickf

Cuestiones relacionadas