LoginSignup
14
12

More than 5 years have passed since last update.

MySQLで連番の歯抜けを取得する

Posted at

対象テーブル(SeqTbl)

  • idは一意
seq name
1 ヤマダ
2 サトウ
3 スズキ
5 キムラ
6 マエダ
8 アオキ
10 タナカ

歯抜けが存在するかどうかのチェック

データ総数とseqの最大値が同じなら歯抜けなしなので

/* sql */
SELECT '歯抜けあり' AS gap
  FROM SeqTbl
HAVING COUNT(*) <> MAX(seq);

/* 結果 */
gap
-
'歯抜けあり'

歯抜けの最小値を取得

※ 歯抜けがなければ最大値の次の11が返る

/* sql */
SELECT MIN(seq + 1) AS gap
  FROM SeqTbl
 WHERE (seq+ 1) NOT IN (SELECT seq FROM SeqTbl);

/* 結果 */
gap
-
4

全取得

Digitsテーブルを作る

0~9までの数字を格納したDigitsテーブルを作成

Digitsテーブルを作る
CREATE TABLE `Digits` (
  `digit` tinyint(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `Digits` (`digit`) VALUES
(0),
(1),
(2),
(3),
(4),
(5),
(6),
(7),
(8),
(9);

シーケンス・ビューを作る(0~999までをカバー)

ほしい桁数分だけ作ります。
ここでは3桁まで作成。

シーケンス・ビューを作る

CREATE VIEW Sequence (seq)
AS SELECT D1.digit + (D2.digit * 10) + (D3.digit * 100)
FROM Digits D1, Digits D2, Digits D3;

比較して値を取り出し

/* sql */
SELECT seq
  FROM `Sequence`
 WHERE seq BETWEEN 1 AND 10
   AND seq NOT IN (SELECT seq FROM SeqTbl);

/* 結果 */
seq
-
4
7
9

参考

HAVING句の力
SQLで数列を扱う

14
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
12