3

主キー_idと次のクエリを使用して、テーブル(ユーザー)からランダムな行を取得しようとしています。

SELECT * 
FROM   user 
WHERE  _id IN (SELECT Floor(1 + ( Rand() * ( Count(_id) - 1 ) )) 
               FROM   user); 

テーブルから削除された行はありませんが、(一貫性のない)複数の行が返されます...

サブクエリの結果は必ず1つの整数を返す必要があるため、これは驚くべきことです。これは、主キーに対して.....常に1レコードのみである必要があります。

1つのクエリを使用したいのですが、おそらくそれをプリペアドステートメントにします。@変数を使用してランダムな行を選択できないため、LIMIT句は使用していません。

私のMySQLウェルカムステートメントは、私のバージョンが次のとおりであることを示しています。サーバーバージョン:5.5.29-0ubuntu0.12.04.2(Ubuntu)

4

3 に答える 3

3

ORDER BY RAND() LIMIT 1;代わりにクエリで使用するのはどうですかwhere _id IN (select FLOOR(1+(RAND()*(COUNT(_id)-1))) from user);

複数の行を取得すると、(ユーザーからFLOOR(1+(RAND()*(COUNT(_id)-1)))を選択)、「ユーザー」テーブルのレコードに対して異なる値が返されます。これはRANDビットが原因です。

select FLOOR(1+(RAND()*(COUNT(_id)-1))) from user単独で実行すると、表示されます。

于 2013-03-08T16:06:27.697 に答える
1

ランダムな部分は行ごとに1回評価されるため、多くの行を取得する場合と、取得しない場合があります。それを簡単かつ迅速に使用し、等結合して制限する

SELECT 
    * 
FROM 
    user 
WHERE 
    _id > (
        SELECT 
            FLOOR(1+(RAND()*(max(_id)-min(_id)))) 
        FROM 
            user
    ) LIMIT 1
;
于 2013-03-08T16:10:53.523 に答える
0
select * 
from user join (select FLOOR(1+(RAND()*(COUNT(_id)-1))) as _id from user) as Temp
on user._id=Temp._id

フィドル-http : //sqlfiddle.com/#!2/2fda3/11

于 2013-03-08T16:13:41.480 に答える