una sumar registros registro primer obtener numero limite limitar hacer consulta con como anterior mysql sql select gaps-and-islands

mysql - sumar - select con limite de registros



consulta sql para obtener registros eliminados (5)

Entonces, para empezar, mostraré la forma más fácil de generar 10.000 registros. Sin consultas enormes, sin variables. Tiempo de ejecución: ~ 3ms. ENLAZAR

Ahora sobre ese disparador que prometí. ENLAZAR

Como puede ver, es realmente fácil crear uno. Tenga en cuenta que el desencadenador es mejor no solo porque no necesita varias uniones, sino que también puede almacenar la fecha, la identificación del usuario, etc., etc. (ejemplo muy expansible). Y el punto principal de desencadenar sobre las uniones es: no importa cuántos registros haya / serán / serán. No necesitas ser estricto con el tamaño. Es por eso que llamé a la respuesta de sam yi no lo suficientemente profesional. Perdón por malentendido, estoy bastante seguro de que ninguno de nosotros quería insultar a nadie.

Al crear este ejemplo, aprendí algunas cosas. Espero que tú también lo hayas hecho :)

Tiene una tabla table1 que contiene la columna id , que es int(11), not null, auto_increment y comienza desde 1.

Supongamos que tiene 10,000 registros. Está claro que la identificación del último registro es 10,000. Una vez que eliminó 3 registros, tiene 9.997 registros en la tabla, pero el último valor de identificación de registro sigue siendo de 10.000 (si no se eliminó el último registro).

¿Cómo se muestran los registros que se han eliminado con 1 consulta sql?

Gracias.



DECLARE @myTestTable1 TABLE ( id INT IDENTITY(1,1) NOT NULL ,testVal int ) DECLARE @increment AS int = 1 WHILE (@increment <= 10000) BEGIN INSERT INTO @myTestTable1 VALUES (@increment) SET @increment += 1 END DELETE FROM @myTestTable1 WHERE id IN (100,200,300) --SELECT * FROM @myTestTable1 ;WITH Missing (missnum, maxid) AS ( SELECT 1 AS missnum, (select max(id) from @myTestTable1) UNION ALL SELECT missnum + 1, maxid FROM Missing WHERE missnum < maxid ) SELECT missnum FROM Missing LEFT OUTER JOIN @myTestTable1 tt on tt.id = Missing.missnum WHERE tt.id is NULL OPTION (MAXRECURSION 0);

Pero está tomando mucho tiempo. Tenemos que reducir el tiempo.


Creo que lo más fácil sería tener una tabla ficticia / temporal con solo identificadores. 1-1000 luego se unieron a esa mesa.

Pero asegúrese de eliminar los registros "eliminados" de su tabla ficticia / temporal una vez que haya terminado. De lo contrario, aparecerán cada vez.

>> EDITAR << Puedes unirte para averiguar si te faltan identificadores ...

select a.id + 1 MissingIds from <table> a left join <table> b on a.id = b.id - 1 where b.id is null and a.id < 10000


Usé esta respuesta como referencia.

Puede usar la siguiente consulta para encontrar las lagunas, que en esencia le darán los "rangos" de registro eliminados. Por ejemplo, en el siguiente ejemplo, obtiene 2 filas en el resultado final, y los valores son 2 y 3, y 6 y 7. Así que sabe que las filas con ID de 2 a 3 se han eliminado y las filas con ID de 6 a 7 han sido eliminados (para un total de 4 filas borradas).

Creo que esto cumple con su requisito de obtener el resultado final en "1 consulta SQL", y además, no se utilizan tablas intermedias o ficticias.

delimiter $$ use test $$ create table mytable (id int not null auto_increment, name varchar(100), primary key (id)); $$ insert into mytable (name) values(''a'')$$ insert into mytable (name) values(''b'')$$ insert into mytable (name) values(''c'')$$ insert into mytable (name) values(''d'')$$ insert into mytable (name) values(''e'')$$ insert into mytable (name) values(''f'')$$ insert into mytable (name) values(''g'')$$ insert into mytable (name) values(''h'')$$ delete from mytable where id = 2$$ delete from mytable where id = 3$$ delete from mytable where id = 6$$ delete from mytable where id = 7$$ SELECT (t1.id + 1) as gap_starts_at , (SELECT MIN(t3.id) -1 FROM mytable t3 WHERE t3.id > t1.id) as gap_ends_at FROM mytable t1 WHERE NOT EXISTS (SELECT t2.id FROM mytable t2 WHERE t2.id = t1.id + 1) HAVING gap_ends_at IS NOT NULL

Salida:

gap_starts_at gap_ends_at 2 3 6 7