Ho usato this answer come riferimento.
È possibile utilizzare la query seguente per trovare gli spazi vuoti, che in sostanza forniranno il record "intervalli" cancellati. Ad esempio, nell'esempio seguente, ottieni 2 righe nel risultato finale e i valori sono 2 e 3, e 6 e 7. Quindi sai che le righe con ID da 2 a 3 sono state eliminate e le righe con ID da 6 a 7 sono stati cancellati (per un totale di 4 righe cancellate).
Credo che questo soddisfi le vostre esigenze di ottenere il risultato finale in "1 query SQL", e in più, non vengono utilizzate tabelle intermedie o fittizie.
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
uscita:
gap_starts_at gap_ends_at
2 3
6 7
Creare una tabella con 10.000 valori sequenziali per fungere da tabella di ricerca. Quindi seleziona tutti i record dalla tua ricerca che non esistono nella tabella di destinazione. * (Questo sarà sempre più veloce di provare a generare dinamicamente gli ID mancanti.) * – MatBailie
Se il tuo DMBS ha una funzione come generate_series() (non penso che mysql lo abbia) potresti usarlo, basato su {min, max }, invece di una tabella * di calander * cablata. – wildplasser
+1 perché ho imparato qualcosa di nuovo rispondendo :) Una domanda decente :) –