0

重複の可能性:
MySQLは60万行から10行をランダムに選択します

300,000 を超えるレコードを含むテーブルがあります。このテーブルから 10 個、13 個、または 20 個のレコードを選択する必要があります。

私は次の方法を試しました。

これは選択に時間がかかります

SELECT * FROM products ORDER BY RAND() LIMIT 0,12

また

この方法は同じですが、複数のレコードを選択できないようです

$temp = mysql_query('SELECT id FROM products limit 0,12');
if ( count( $temp ) > 0 ) {
    $j = 1;
    foreach( $temp as $index => $row ) {
        $p[$j++] = $row[id];
    }
    $my_p= $p[ rand( 1, --$j ) ];
    $pp = 'SELECT id FROM products WHERE id = {$my_p}';
}

更新: このMySQL に続いて、600K 行から 10 行をランダムに選択します。

私は持っている

    SELECT * FROM QM_Products AS r1 
JOIN (SELECT (RAND() * (SELECT MAX(id) 
FROM QM_Products )) AS id) AS r2 WHERE r1.id >= r2.id 
ORDER BY r1.id ASC 
LIMIT 0, 10 

これは動作します ありがとうございました。

4

2 に答える 2

1

このソリューションを使用することを選択しました:

SELECT * FROM QM_Products AS r1 
JOIN (SELECT (RAND() * (SELECT MAX(id) 
FROM QM_Products )) AS id) AS r2 WHERE r1.id >= r2.id 
ORDER BY r1.id ASC 
LIMIT 0, 10 

ただし、ランダムな式がテーブルの最後に近い ID を返す場合、10 行未満になる可能性があることを指摘しておきます。

また、返される行には常に隣接する id 値があるため、これはランダムな選択ではありません。

解決策は別ORDER BY RAND()として (もちろん、これはインデックスを使用できないため、大規模なデータセットではうまく機能しません)、多数の行をランダムに選択する別の方法を考えることができます。以下は疑似 PHP コードです。

// MAX(id) is quicker than COUNT(*) in InnoDB
$maxid = query "SELECT MAX(id) FROM QM_Products"

// generate a list of N random values, making sure they're distinct
$id_list = array();
while (count($idlist) < 10) {
  $rand_id = mt_rand(1,$maxid);
  $id_list[$rand_id] = 1;
}

// convert the id list to a comma-separated string in an SQL query
$id_list = implode(",", array_keys($id_list)); 
$rows = query "SELECT * FROM QM_Products WHERE id IN ($id_list)"

一致する ID を持つ行が存在しないギャップにランダム値がヒットした場合、N 行より少ない行が取得される可能性があります。ORDER BY RAND()ただし、上記の方法は、一度に 1 行に対して N 個のクエリを発行するよりもはるかに高速です。したがって、N 行を見つけるのに必要な回数だけ検索を繰り返すループを設計できます。ギャップが非常に大きい場合、十分な行を見つける前に長時間ループする可能性があるため、これは適切ではありません。

于 2012-12-25T18:22:52.873 に答える
1

このphpコードを試してください

$r = mysql_query("SELECT count(*) FROM user");  
$d = mysql_fetch_row($r);  
$rand = mt_rand(0,$d[0] - 1);  

$r = mysql_query("SELECT username FROM user LIMIT $rand, 1"); 
于 2012-12-25T17:29:09.217 に答える