2010-12-08 4 views
8

MySQLで整数の範囲を選択する必要があります。このMySQLのSELECT範囲の整数。例えば。 1,2,3,4、...、n;

SELECT RANGE(10,20) AS range;

ような何かを返す

10, 11, 12, 13, 14, ..., 20

なぜ?
まだ登録されていない範囲から任意の電話番号を選択したいと思います。これはアイデアです。クエリと

SELECT RANGE(100000,999999) AS range FROM phone WHERE phoneNum <> range LIMIT FLOOR(100000 + RAND()*(899999);

+2

なぜSQLクエリを使用しているプログラム内で実行しないのですか? –

+0

常に1つの電話番号を返す必要がありますか、または一度に1000の新しい電話番号を選択できるようにしたいですか?そして、あなたはどこかに「すでに与えられた」電話番号のテーブルを持っていますか? – thomaspaulb

答えて

8

問題:

  1. あなたはWHERE句でrangeを使用することはできません。これはエイリアスで、WHERE句が実行された後にのみ定義されます。
  2. たとえそれを使用することができたとしても、<>を使用して数値と数値を比較するのは意味がありません。一般的にはIN(...)を使用できますが、具体的にはBETWEEN 100000 and 999999を使用し、RANGE機能が不要です。
  3. 1つの数字だけが必要な場合、制限は1でなければなりません。ランダムではありません。通常ランダムな項目を選択するには、ORDER BY RAND()を使用します。

このクエリを試してみてください:あなたがあなたのテーブルに存在しない番号を検索したい場合は

SELECT phoneNum, 100000 as rangeStart, 999999 AS rangeEnd 
FROM phone 
WHERE phoneNum NOT BETWEEN 100000 AND 999999 
ORDER BY RAND() 
LIMIT 1 

を、利用可能な番号が枯渇に近いではありません(たとえば80%未満が割り当てられています)良い方法は、乱数を生成し、乱数を見つけ出すまで割り当てられているかどうかをチェックすることです。

純粋なMySQLのソリューションが存在するかもしれませんが、私はそれがいくつかのねじれ結合、ランダムおよびモジュラスを必要とすると思います。

+0

そのクエリは既存の電話番号を返しませんか?彼はテーブルに存在しない範囲のランダムな値、つまり 'SELECT number FROM RANGE(100000,999999)が存在しない場合(SELECT phoneNum FROM phone WHERE phoneNum = number)ORDER BY RAND()LIMIT 1' - 'RANGE'がオンザフライで数字のテーブルを生成した場合 – Rup

+0

@Rup今あなたが言っているように、意味があります。私は今までのところ要件を理解していませんでした。 –

+0

@Rupそのような種類のテーブルをオンザフライで生成することは非常に効率的だとは思いません。 –

0

代替:すべての

まず1からMAX_NUMまでのすべての数字を持っているだけの数字を持つテーブルを作成します。あなたも限界値を変更することで、比較的高速な複数の番号を取得することができます

SELECT n.id as newNumber 
FROM numbers AS n 
LEFT JOIN phone AS p 
    ON p.phoneNum = n.id 
WHERE 
    p.phoneNum IS NULL AND 
    n.id BETWEEN lowerLimit AND upperLIMIT  
ORDER BY RAND() 
LIMIT 1 

この方法:

は、このクエリを使用しています。

関連する問題