MySQL :la selección de la X más pequeño de los valores de
-
13-09-2019 - |
Pregunta
Supongamos que se tiene una tabla como esta :
CREATE TABLE `amoreAgentTST01` (
`moname` char(64) NOT NULL DEFAULT '',
`updatetime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`data` longblob,
PRIMARY KEY (`moname`,`updatetime`)
Tengo una consulta para encontrar el más antiguo de los registros para cada uno de los distintos 'moname', pero sólo si hay varios registros para este 'moname' :
SELECT moname, updatetime FROM amoreAgentTST01 a
WHERE (SELECT count(*) FROM amoreAgentTST01 x WHERE x.moname = a.moname) > 1
AND a.updatetime = (SELECT min(updatetime) FROM amoreAgentTST01 y WHERE y.moname = a.moname) ;
Mi pregunta es :cómo hacer lo mismo pero seleccionando la X más antigua de valores ?Ahora me basta con ejecutar esta, eliminar los más antiguos valores y vuelva a ejecutar es...que no es tan agradable.
Segundos pregunta es :¿qué piensa usted de la consulta anterior ?puede ser mejorado ?es allí cualquier obvio mala práctica ?
Gracias de antemano por sus consejos y ayuda.
Barth
Solución
Sería algo así como este trabajo (no probado):
SELECT moname, MIN(updatetime) FROM amoreAgentTST01
GROUP BY moname HAVING COUNT(moname)>1
Edit: el de arriba es sólo como un reemplazo para el código existente, por lo que directamente no responder a su pregunta.
Creo que algo como esto debería funcionar para su pregunta principal:
SELECT moname, updatetime FROM amoreAgentTST01
GROUP BY moname, updatetime
HAVING COUNT(moname)>1
ORDER BY updatetime LIMIT 0, 10
Editar - lo siento, lo anterior no funciona porque es regresar a sólo 10 los registros para todos los monames - en lugar de los 10 más antiguo para cada uno.Que me creo.
Uno de los más ir a este (lo admito, este se ve un poco complicada):
SELECT a.moname, a.updatetime FROM amoreAgentTST01 a
WHERE EXISTS
(SELECT * FROM amoreAgentTST01 b
WHERE a.moname = b.moname AND a.updatetime = b.updatetime
ORDER BY b.updatetime LIMIT 0, 10)
AND (SELECT COUNT(*) FROM amoreAgentTST01 x WHERE x.moname = a.moname) > 1
Debo añadir que si hay una columna de ID - generalmente los de clave principal, a continuación, que debe ser utilizado para la sub-consulta une para mejorar el rendimiento.