É tentador simplesmente usar a função RAND () do MySQL para selecionar registros aleatórios de uma tabela. Considere a seguinte consulta:
SELECT FLOOR(7 + (RAND() * 5));
No entanto, ao considerar as despesas gerais, esse é um método bastante caro de se empregar. Isso se torna muito evidente ao lidar com grandes conjuntos de dados.
Uma solução eficaz é selecionar o primeiro e o último ids e deixar o PHP gerar o inteiro aleatório (id). Em seguida, basta verificar se o registro existe usando o número inteiro aleatório. Se existir, adicione o registro a uma matriz de registros.
public function getRandomRecords()
{
// Select the first id in the target table
$statement = $this->db->prepare("SELECT some_id
FROM table_name
ORDER BY some_id ASC LIMIT 1");
$statement->execute();
$lowest_id = $statement->fetch(PDO::FETCH_ASSOC);
// Select the last id in the target table
$statement = $this->db->prepare("SELECT some_id
FROM table_name
ORDER BY some_id DESC LIMIT 1");
$statement->execute();
$highest_id = $statement->fetch(PDO::FETCH_ASSOC);
$records_array = array();
while(true)
{
// Generate a random integer
$random_id = rand( $lowest_id['some_id'], $highest_id['some_id'] );
// Check to see if the record exists
$statement = $this->db->prepare("SELECT col_one, col_two, etc...
FROM table_name
WHERE some_id = {$random_id}";
$statement->execute();
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
// If it exists, add it to the array
if($result) {
$records_array[] = $record;
}
$i++;
// If the array contains 5 records, stop
if(count($records_array) == 5) {
break;
}
}
return $records_array;
}