対象テーブル(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