1. ホーム
  2. mysql

[解決済み] mysqlの連番でギャップを見つけるには?

2022-06-24 05:11:32

質問

他のシステムから値をインポートしたテーブルを持つデータベースがあります。自動インクリメントの列があり、重複する値はありませんが、欠落した値があります。例えば、このクエリを実行する。

select count(id) from arrc_vouchers where id between 1 and 100

は100を返すべきですが、代わりに87を返します。不足している数値の値を返すようなクエリはありますか?例えば、id1-70と83-100のレコードは存在しても、idが71-82のレコードは存在しません。71、72、73などを返したいのですが。

このようなことは可能でしょうか?

どのように解決するのですか?

更新情報

ConfexianMJSの提供 より良い 答え 性能の面で

(最速ではない)答え

あらゆるサイズのテーブルで動作するバージョンです(100行だけではありません)。

SELECT (t1.id + 1) as gap_starts_at, 
       (SELECT MIN(t3.id) -1 FROM arrc_vouchers t3 WHERE t3.id > t1.id) as gap_ends_at
FROM arrc_vouchers t1
WHERE NOT EXISTS (SELECT t2.id FROM arrc_vouchers t2 WHERE t2.id = t1.id + 1)
HAVING gap_ends_at IS NOT NULL

  • gap_starts_at - 現在のギャップの最初のID
  • gap_ends_at - 現在のギャップの最後の ID