Utilicé this answer como referencia.
Puede usar la siguiente consulta para encontrar los huecos, que en esencia le darán los "intervalos" de registros 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
Cree una tabla con 10,000 valores secuenciales para actuar como una tabla de búsqueda. Luego, seleccione todos los registros de su búsqueda que no existan en su tabla de destino. * (Esto siempre será más rápido que tratar de generar dinámicamente los ID faltantes). * – MatBailie
Si su DMBS tiene una función generate_series() like (no creo que mysql lo tenga), podría usar eso, basado en {min, max }, en lugar de una tabla * de calendario cableado *. – wildplasser
+1 porque aprendí algo nuevo respondiéndola :) Una pregunta decente :) –