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

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

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