この回答を参考にしました。
次のクエリを使用してギャップを見つけることができます。これにより、本質的に、削除されたレコードの「範囲」が得られます。たとえば、次の例では、最終結果に2行が返され、値は2と3、および6と7です。したがって、IDが2から3の行が削除され、IDの行が削除されていることがわかります。 6から7までが削除されました(合計4行が削除されました)。
これは、「1 SQLクエリ」で最終結果を取得するという要件を満たしていると思います。さらに、中間テーブルやダミーテーブルは使用されていません。
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
出力:
gap_starts_at gap_ends_at
2 3
6 7