Maison >base de données >tutoriel mysql >Comment sélectionner efficacement des lignes aléatoires dans une table MySQL sans ORDER BY RAND() ?

Comment sélectionner efficacement des lignes aléatoires dans une table MySQL sans ORDER BY RAND() ?

Linda Hamilton
Linda Hamiltonoriginal
2024-12-04 13:39:10299parcourir

How to Efficiently Select Random Rows from a MySQL Table Without ORDER BY RAND()?

Utiliser MySQL pour sélectionner des lignes aléatoires

Question :

Comment sélectionner efficacement un nombre spécifié de lignes aléatoires dans un grande table sans utiliser l'ORDER BY RAND() potentiellement gourmand en ressources méthode ?

Réponse :

Solution MySQL :

Pour sélectionner X lignes aléatoires de la classe "une" sans utiliser 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;

Cette approche consiste à définir un décalage aléatoire en fonction de la taille de la table et à l'utiliser pour récupérer le nombre de lignes souhaité.

Solution PHP :

Si vous utilisez PHP, vous pouvez mettre en œuvre les étapes suivantes pour obtenir le même résultat :

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

Ce code détermine un décalage aléatoire dans le nombre de lignes de la table et l'utilise pour sélectionner le nombre spécifié de lignes aléatoires via une requête LIMIT et OFFSET.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn