[前][次][番号順一覧][スレッド一覧]

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]