sql >> データベース >  >> RDS >> Mysql

MySQLでランダムな行を選択する

    ORDER BY RAND() すでにご存知のように、ほとんどの人が推奨するソリューションは、大きなテーブルに拡張できません。

    SET @r := (SELECT FLOOR(RAND() * (SELECT COUNT(*) FROM mytable)));
    SET @sql := CONCAT('SELECT * FROM mytable LIMIT 1 OFFSET ', @r);
    PREPARE stmt1 FROM @sql;
    EXECUTE stmt1;
    

    このソリューションと他のソリューションについては、私の本 SQLアンチパターン:データベースプログラミングの落とし穴の回避で説明しています。

    PHPでこれを実行したい場合は、次のようなことを実行できます(テストされていません):

    <?php
    $mysqli->begin_transaction();
    $result = $mysqli->query("SELECT COUNT(*) FROM mytable")
    $row = $result->fetch_row(); 
    $count = $row[0]; 
    $offset = mt_rand(0, $count);
    $result = $mysqli->query("SELECT * FROM mytable LIMIT 1 OFFSET $offset");
    ...
    $mysqli->commit();
    


    1. SequelizeConnectionError:自己署名証明書

    2. 最適化のしきい値–データのグループ化と集約、パート5

    3. 休止状態:エンティティクラスに基づいてdbテーブルを自動的に作成/更新します

    4. PostgreSQLマルチクラウドクラスターの展開