次のような結果を得たいときにどのようなSQLを書けばよいのか教えてください。(MySQL5)


id
1
2
3
4
7
10
15

このように連番でid(最大で100まで)が振られているテーブルがあるとして、そのうちの一部を削除して上記のような状態になっているとします。

この状態で「空いている最も小さなid(この場合は【5】)」を取得したいのですが、どのように書けばよいでしょうか?

id

1
2
3
4
5
6

この場合は【7】を取得したいです。
新たにデータを登録する際に「空いている最も小さなidに入れたい」というのが趣旨です。


よろしくお願いします。

回答の条件
  • 1人5回まで
  • 登録:2008/11/03 17:25:57
  • 終了:2008/11/03 20:32:04

回答(2件)

id:kn1967 No.1

kn1967回答回数2915ベストアンサー獲得回数3012008/11/03 17:57:38

ポイント40pt
SELECT T1.id + 1 AS NewID
FROM テーブル名 AS T1
WHERE NOT EXISTS (SELECT * FROM テーブル名 AS T2 WHERE T2.id = T1.id + 1)
ORDER BY T1.id
LIMIT 1
;

自身に1プラスしたidが存在しないレコードに絞り込み、

並び替え、そして最初の1レコードを取得するという考え方です。

他にもっと効率の良い方法があれば良いのですが・・・。

id:southgate_01

コメントありがとうございます。

さっそくやってみます。

2008/11/03 18:15:57
id:khazad-Lefty No.2

khazad-Lefty回答回数181ベストアンサー獲得回数272008/11/03 18:03:53

ポイント40pt

すなおに考えたら、別に1~100までを格納されているテーブルを別に用意するのが無難だと思います。

その上で、元のテーブルをtable1,上記連番テーブルをtable2とすると

Select min(table1.id) 
 from table1
 left join table2
  on table1.id=table2.id
where table2.id is null

で取れるはずです。

id:southgate_01

コメントありがとうございます。


このやり方だとできそうなのですが、この為だけに別テーブルを用意するというのはちょっと迷いますね。

2008/11/03 18:18:10
  • id:hu2
    kn1967さんとほぼ同じなのですが、以下がより一般的なのではと思います。

    SELECT MIN(id + 1) FROM some_table r1 WHERE NOT EXISTS (SELECT * FROM some_table r2 WHERE r2.id = r1.id + 1);
  • id:kn1967
    100件程度ですからインデックスの有用性もあまりなく
    MIN のほうが良いかもしれませんね。

    コストを考えると MIN(id) としておいて
    アプリケーション側で +1 するほうがモアベターかと・・・。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません