mysql:8888
From: 柴垣 <柴垣 <akiro@xxxxxxxxxx>>
Date: Tue, 02 Mar 2004 20:50:56 +0900
Subject: [mysql 08888] Re: 整数フィールドの次の空きを探す sql は
かわじ さま、松枝さま、班石さま 早速の回答、ありがとうございます。 > そのシーケンシャルのテーブルを t_seq として > > select min(t.id) from t_seq left join t using (id) > where t.id > 2 and t_seq.id is null group by t.id; > > で、いかがでしょう? わたしも、似たような方向では考えてみているのですが、 (上のSQL文は、下記のようでしょうか? t_seq が跳びの ないシーケンシャルなファイルとすると、以下のように なると思うのですが、シーケンシャルテーブルの意味が 私の了解と違うのかもしれません。) select min(t_seq.id) from t_seq left join t using (id) where t_seq.id > 2 and t.id is null group by t.id; ただし、この方法では、シーケンシャルテーブルをどう やって作るかが、問題になります。例えば、整数1から 整数2までのシーケンシャルテーブルを作るにはどうすれば いいのでしょうか。はじめに auto increment のフィールドに 整数1をいれ、その後、(整数2−整数1)個のnull データを 追加する、といった方法しか今のところ思いつきません。 これまでに検討した途中経過だけを、一応ご報告しておくと、 プラン1.その次の行とのId フィールドの差分が1より 大きいレコードの次にId のとびがある、と考える。 (元テーブル t に、シーケンシャルなフィールドridを追加して select t1.id, t1.id - t2.id as dif from t as t1, t as t2 where t1.rid + 1 = t2.rid having dif > 0; のようにし、見つかった id の次に跳びがあると考える。 (実際のSQL文には、これに id の範囲の制限がつく) プラン2.auto_increment フィールド、auto を持った作業 テーブル w に、例えば検索の先頭の数字 n より大きいレコードを 書き出す。数字に空きが生じるレコードは、 select id from w where auto + n != id order by id limit 1; のように拾い出し、その前のレコードのひとつ先の数字を拾う。 などです。 > 何の目的で数字の抜けを捜さなければならないのか とりあえず、先方の要求なのですが、ランダムに使っている数字を ムダなく使い切りたい、そのための候補を自動的に提示したい、 といった用途です。 _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ 柴垣 akiro@xxxxxxxxxx _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
8880 2004-03-02 15:16 [柴垣 顕郎 <akiro@xx] 整数フィールドの次の空きを探す sql は 8882 2004-03-02 15:59 ┣[KAWAJI Shinya <kawaj] 8883 2004-03-02 16:04 ┃┗[KAWAJI Shinya <kawaj] -> 8888 2004-03-02 20:50 ┃ ┗[柴垣 <akiro@xxxxxxxx] 8889 2004-03-02 23:40 ┃ ┗[ML account <ml@xxxxx] 8890 2004-03-03 08:47 ┃ ┗[KAWAJI Shinya <kawaj] 8894 2004-03-03 09:28 ┃ ┣[柴垣 <akiro@xxxxxxxx] 8899 2004-03-03 12:54 ┃ ┃┗[Seiji Uramoto <uramo] 8895 2004-03-03 10:11 ┃ ┣[ML account <ml@xxxxx] 8898 2004-03-03 12:35 ┃ ┗[班石悦夫 <madara@xxx] 8900 2004-03-03 14:44 ┃ ┗[ML account <ml@xxxxx] 8885 2004-03-02 16:19 ┣[ML account <ml@xxxxx] 8886 2004-03-02 18:48 ┗[班石悦夫 <madara@xxx]