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

mysql:3806

From: Kentaro Furukawa <Kentaro Furukawa <furukawa@xxxxxxxxxx>>
Date: Fri, 22 Jun 2001 17:41:49 +0900
Subject: [mysql 03806] Re: 含まれていない ID をみつけだすような SQL

古川と申します。

> ここであるひとつのSQLを用いて、1から7までのうち空いているIDを出力とする、
> 
> +------+
> | id   |
> +------+
> |     4|
> |     6|
> +------+
> 
> という結果が欲しいときは、どういうSQLを書くのが高速でしょうか?

これをそのまま取得できるわけではないですが、少なくとも「存在する数値全部
を取得して抜けているのをチェックする」ようなマネはしなくてすむ方法、なら
思いつきました。

前提条件として、最初と最後の数値(この例の場合は1と7)が番兵として必ず
存在するものとします(そうと限らなければ、0と8を INSERT しておくとよい
でしょう)。存在する数値列を昇順に並べた時、隣り合った数値が2以上離れて
いればその間が抜けていることになりますから、

SELECT
  MAX(h1.id) AS prev,
  h2.id AS curr
>FROM
  hoge h1,
  hoge h2
WHERE
  h1.id < h2.id
GROUP BY
  curr
HAVING
  prev+1 < curr

で、

prev curr 
---------
 3   5
 5   7

を得て、prev+1 で始まり curr-1 で終わる数値列を作成していけば抜けている数
値列を求められます。
お役に立てていただければ幸いです。



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

      3798 2001-06-21 02:07 [Kengo Nakajima <ring] 含まれていない ID をみつけだすような SQL
      3803 2001-06-22 15:34 ┣[とみたまさひろ <tomm]                                       
      3805 2001-06-22 17:39 ┃┗[<endo_t@xxxxxxxxxx> ]                                     
      3804 2001-06-22 16:20 ┣[とみたまさひろ <tomm]                                       
->    3806 2001-06-22 17:41 ┣[Kentaro Furukawa <fu]                                       
      3807 2001-06-22 18:58 ┗[松嶋祥文 <mats@xxxxx]