2009-10-04 6 views
1

Pour sélectionner aléatoirement des enregistrements d'une table; dois-je toujours définir une variable temporaire en PHP? J'ai besoin d'aide pour sélectionner des lignes aléatoires dans un modèle CodeIgniter, puis afficher trois lignes différentes dans une vue chaque fois que ma page d'accueil est affichée. Quelqu'un at-il des idées sur la façon de résoudre ce problème? Merci d'avance!Sélection aléatoire de lignes avec MySQL

Répondre

2

J'ai ce morceau de code en production pour obtenir un devis aléatoire. Utiliser la fonction RAND de MySQL était super lent. Même avec 100 citations dans la base de données, je remarquais un décalage sur le site Web. Avec cela, il n'y avait pas de décalage du tout.

$result = mysql_query('SELECT COUNT(*) FROM quotes'); 
$count = mysql_fetch_row($result); 
$id = rand(1, $count[0]); 
$result = mysql_query("SELECT author, quote FROM quotes WHERE id=$id"); 
4

je ferais quelque chose comme:

SELECT * FROM table ORDER BY RAND() LIMIT 1; 

Cela mettra les données dans un ordre aléatoire, puis revenir seule la première ligne de cet ordre aléatoire.

5

Si vous ne disposez pas d'une tonne de lignes, vous pouvez simplement:

SELECT * FROM myTable ORDER BY RAND() LIMIT 3; 

Si vous avez plusieurs lignes, cela se lent, mais pour des données plus petits ensembles, il fonctionnera très bien. Comme Steve Michel le mentionne dans sa réponse, cette méthode peut devenir très laide pour les grandes tables. Sa suggestion est un bon endroit pour sauter de. Si vous connaissez le PK entier maximum approximatif sur la table, vous pouvez faire quelque chose comme la génération d'un nombre aléatoire entre un et votre valeur maximum PK, puis saisir les lignes au hasard un à la fois comme:

$q="SELECT * FROM table WHERE id >= {$myRandomValue}"; 
$row = $db->fetchOne($q); //or whatever CI's interface to grab a single is like 

Bien sûr, si vous avez besoin de 3 lignes aléatoires, vous aurez trois requêtes ici, mais comme elles sont entièrement sur le PK, elles seront plus rapides que la randomisation de toute la table.

2

Commande d'une grande table en rand() peut être très cher si la table est très grande. MySQL devra construire une table temporaire et la trier. Si vous avez une clé primaire et que vous connaissez le nombre de lignes présentes dans la table, utilisez LIMIT x, 1 pour saisir une ligne aléatoire, où x est le numéro de la ligne que vous voulez obtenir.

Questions connexes