• ベストアンサー

空き番号取得について

テーブルから空き番号取得するという方法を 探しているのですが http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22751&forum=26&6 にあったように「今入っている数字の次の番号」を 取得する方法はわかりましたが 先頭の判断をSQLで判別するには どのようにしたらいいでしょうか? よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • moon_night
  • ベストアンサー率32% (598/1831)
回答No.3

あんまり効率的な感じはしませんが・・・ メンバーのID空き番号をとる場合です。 IDが多くない場合は最初の10000を消しても問題ありません。 ご参考までに。 $j=0; while(1) { $j++; $i_st = $j; $j += 9999; $i_ed = $j; $sql = "select id from member"; $sql .= " where $i_st <= id and id <= $i_ed"; $rs = mysql_query($sql); if ($rs) { $rows = mysql_num_rows($rs); } if ($rows != 10000) { $j -= 10000; break; } } while(1) { $j++; $i_st = $j; $j += 999; $i_ed = $j; $sql = "select id from member"; $sql .= " where $i_st <= id and id <= $i_ed"; $rs = mysql_query($sql); if ($rs) { $rows = mysql_num_rows($rs); } if ($rows != 1000) { $j -= 1000; break; } } while(1) { $j++; $i_st = $j; $j += 99; $i_ed = $j; $sql = "select id from member"; $sql .= " where $i_st <= id and id <= $i_ed"; $rs = mysql_query($sql); if ($rs) { $rows = mysql_num_rows($rs); } if ($rows != 100) { $j -= 100; break; } } if ($j == 0) { $j++; } for ($i=$j;;$i++) { $sql = "select * from member where id = '$i'"; $rs = mysql_query($sql); if ($rs) { $rows = mysql_num_rows($rs); } if (!$rows) { #echo "<font color=red>$i</font><br>"; $_POST['id'] = $i; break; } else { #echo "$i<br>\n"; } }

VIPFIRE
質問者

お礼

お返事ありがとうございます。 先頭が見つかるまでSQL発行するのですね、 ちょっとパフォーマンス的に重そうなイメージが ありますが 今回は今のところそのマスタの桁数は2とかなり 少なめなので大丈夫かと思います。 ためしに動かしてみて動作確認できました。 ありがとうございます。

その他の回答 (3)

回答No.4

どうしてもやりたかったら、ID管理用のテーブルを作った方が簡単です。

VIPFIRE
質問者

お礼

お返事ありがとうございます。 削除時に空き番号IDを追加 とマスタ追加時の空き番号検索時にID消去という感じですね。 こちらも試してみようと思います。 ありがとうございました。

回答No.2

こんなことでしょうか? Mysql4.1以降であればいけるはずです。 select * from (select id from hoge) TBL1 right join (select 0 as id union select id+1 from hoge) TBL2 on TBL1.id = TBL2.id; unionクエリで強制的に0データを作成しております。 これで TBL1.id列がnullのTBL2.idの値が存在していないはずです。

VIPFIRE
質問者

お礼

お返事ありがとうございます。 是非こちらを試してみたいのですが 今回の案件はmysql 3.23.39で作ることになっています。 しかしながら勉強になりました、次の機会は是非これで ためさせていただきます。

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>先頭の判断をSQLで判別 質問の意味がよくわかりませんが、 MIN(`ID`)が先頭ではないでしょうか?

VIPFIRE
質問者

お礼

>質問の意味がよくわかりませんが 後々読み返してみるとこの説明では 何がしたいかわからないですね、 申し訳ありませんでした。 お礼の欄ですがこの場をお借りして説明致します。 あるマスタのキーであるIDの数字を取りたいのですが 行が削除されることもあるので空き番号がでます。 オーバーフローした場合、空き番号の最小値を 取りたいという動作がしたいのです。 マスタとマスタのID+1のテーブルを結合して あらかじめ入っている最小値より上にある空き番号を 取得するやり方がわかったのですが IDが2,3,5,6・・・とあれば最小値より 下にある0や1を取得するには どうしたらよいのでしょうか?という質問でした。

VIPFIRE
質問者

補足

お返事ありがとうございます。 補足させていただきますと MIN(`ID`)だとすでに入っている最小値が2である場合 空き番号である0と1がとれないのです。 宜しくお願いいたします。

関連するQ&A