2

表の中央のどこからでも30行(順番に)を選択したいと思います。serial一意のauto_incrementシリアル番号を持つ列''を追加してこれを実行しようとしています。私のコードは次のとおりです。

SELECT * FROM A2 
     WHERE serial>(
         SELECT ROUND(RAND()*(
              SELECT COUNT(*) FROM A2))
) LIMIT 30

パーツ(SELECT ROUND(RAND()*(SELECT COUNT(*) FROM A2)))は完全に機能しています。つまり、1からテーブルの行数までの乱数を生成しますが、完全なクエリは機能していません。シリアル進行していない行をスローし、ほとんどの場合、シリアルが30未満の最初の行をスローします。

誰かが私がこのクエリを書くのを手伝ってくれますか?

ありがとう

4

4 に答える 4

1

これを試して

SELECT * FROM A2 ORDER BY RAND() LIMIT 30

これにより、ランダムに30行が選択されます。

于 2013-02-26T07:41:14.163 に答える
1

このように追加ORDER BY serialします:

SELECT * 
FROM A2 
WHERE serial > (
    SELECT ROUND(RAND() * (
        SELECT COUNT(*) FROM A2))) 
ORDER BY serial
LIMIT 30;

FLOORまた、次のように、代わりにを使用ROUNDして上限から30を引く必要があります。

WHERE serial > (
    SELECT FLOOR(RAND() * ((SELECT COUNT(*) FROM A2) - 30))) 

そうしないと、ランダムがテーブルの終わりに近いときに30行未満になる可能性があります。

ごめん。その答えは間違っていました。これが私のために働くものです:

SELECT a2.*
FROM a2, 
    (SELECT FLOOR(RAND() * ((SELECT COUNT(*) FROM a2) - 30)) AS r) AS r 
WHERE a2.serial BETWEEN r.r AND r.r + 29;
于 2013-02-26T07:41:44.737 に答える
1

シリアルが0から始まると仮定すると、これは機能するはずです。1から始まる場合は、。に置き換え>=>ください。

SELECT A2.*
FROM A2 
JOIN (SELECT FLOOR(RAND() * (SELECT COUNT(*)-29 FROM A2)) serial) b
WHERE a2.serial >= b.serial
ORDER BY a2.serial
LIMIT 30;

でテストするSQLfiddle

于 2013-02-26T08:16:27.873 に答える
0

私はこれをするだけです

SELECT * FROM A2 
WHERE serial > (
    SELECT ROUND(RAND()*(SELECT COUNT(*) FROM A2))
) 
ORDER BY serial
LIMIT 30
于 2013-02-26T08:17:15.083 に答える