Mysql
 sql >> Base de données >  >> RDS >> Mysql

Sélection de lignes aléatoires avec MySQL

Le ORDER BY RAND() la solution que la plupart des gens recommandent ne s'adapte pas aux grandes tables, comme vous le savez déjà.

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;

Je couvre cela et d'autres solutions dans mon livre, Antipatterns SQL :éviter les pièges de la programmation de base de données .

Si vous voulez faire cela avec PHP, vous pouvez faire quelque chose comme ceci (non testé) :

<?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();