mysql:8896
From: "Ebihara, Yuichiro" <"Ebihara, Yuichiro" <Yuichiro.Ebihara@xxxxxxxxxx>>
Date: Wed, 3 Mar 2004 10:59:25 +0900
Subject: [mysql 08896] RE: 整数フィールドの次の空きを探す sql は
MySQL MLの皆さん、 初めましてこんにちは、海老原と申します。 最近のバージョンで使えるらしい副問い合わせって、どの程度まで いけるんでしょう? 実機で試してないので、単なるヒント程度に捉えてもらいたいのですが、 > たとえば、1、3、4、5、8、9、といったような、順番には並んでいるが > 値に跳びのあるフィールドを持つテーブルがあって、ある数字から > 次のあいている数字を探す、というものです。昇順では2ならば6、 > 6ならば7、7ならば10をみつけるもの。降順では10ならば7、 > 7ならば6、6ならば2、2ならば0、0ならば該当なし、 > といった検索です。 昇順 SELECT min(a.id + 1) FROM t_seq a WHERE a.id >= [基準値] AND not exists (SELECT 'X' FROM t_seq b WHERE b.id = a.id + 1) 降順 SELECT max(a.id - 1) FROM t_seq a WHERE a.id <= [基準値] AND not exists (SELECT 'X' FROM t_seq b WHERE b.id = a.id - 1) ; ただしこれだと昇順で6ならば7、降順で7ならば6ができません。 その条件も満たそうとすると、さらにトリッキーになって、MySQLで 実行できるかどうかがさらに怪しくなりますが、 昇順 SELECT min(a.id + 1) FROM ( SELECT id FROM t_seq WHERE id >= [基準値] UNION ALL SELECT [基準値]) a WHERE not exists (SELECT 'X' FROM t_seq b WHERE b.id = a.id + 1); 降順 SELECT max(a.id - 1) FROM ( SELECT id FROM t_seq WHERE id <= [基準値] UNION ALL SELECT [基準値]) a WHERE not exists (SELECT 'X' FROM t_seq b WHERE b.id = a.id - 1); 手元にある某RDBではうまくいくので、理論的には合ってると思いますが、 ご参考まで。 今後もちょくちょく出入りさせていただこうと思いますので、皆さま どうぞよろしくお願いします。 -- 海老原 雄一郎 / EBIHARA Yuichiro E-mail: Yuichiro.Ebihara@xxxxxxxxxx