3

テーブルがあり、1 つの mysql クエリを使用してランダムな一意の値を生成したいと考えています。次のようなテーブル構造:

id | unique_id
1  | 1
2  | 5
3  | 2
4  | 7

unique_id は整数 (10) 符号なし

したがって、毎回 unique_id フィールドに一意のランダム値 (私の例では 1、5、2、7 ではありません) を入力したいと考えています。

アルゴリズムは次のとおりです。

1. Get 1 unique random value, which will not have duplicates in unique_id field
2. Create new row with unique_id = result of 1 query

私は試した

SELECT FLOOR(RAND() * 9) AS random_number 
FROM table 
HAVING random_number NOT IN (SELECT unique_id FROM table) 
LIMIT 1

しかし、それは一意の値ではありません..

注: 乗数 = 9 は単なる例です。このような乗数を使用すると、この問題を簡単に再現できます。

4

2 に答える 2

3

これを行う 1 つの方法は、id列をランダムな順列として使用することです。

select id
from tables
order by rand()
limit 1

(あなたの例は 1 つの値のみを返します。)

各 ID に対して反復可能な乱数を返すには、次のようにします。

select id,
       (select count(*) from table t2 where rand(t2.id) < rand(t.id)) as randomnumber
from table t

これが行っていることは、乱数ジェネレーターをシードすることにより、安定した並べ替え順序を生成することです。これは特に効率的ではありませんが、一意性が保証されます。

変数を使用するより効率的な代替手段は次のとおりです。

SELECT  id, @curRow := @curRow + 1 AS random_number
FROM table CROSS JOIN (SELECT @curRow := 0) r
order by rand()

注: これは、必ずしも ID からではなく、テーブルのサイズまでの乱数を返します。これは良いことかもしれません。

最後に、ちょっとしたトリックで作業しようとしていたという考えを得ることができます。md5 ハッシュを計算してから、最初の 4 文字を整数としてキャストし、表を確認します。

SELECT convert(hex(left(md5(rand()), 4)), unsigned) AS random_number 
FROM table 
HAVING random_number NOT IN (SELECT unique_id FROM table) 
LIMIT 1

値をテーブルに挿入し直す必要があります。また、テーブルにない値を実際に取得できるという保証はありませんが、最大数百万の値に対して機能するはずです。

于 2013-01-12T14:21:55.730 に答える
0

MD5 ハッシュを unique_ID として使用できる場合は、MD5(NOW()) を使用してください。これにより、ほぼ確実に毎回一意の ID が生成されます。

参考:MySQL フォーラム

于 2013-01-12T14:23:19.403 に答える