2010-12-02 9 views
0

En ce moment je sélectionne 3 lignes aléatoires d'une table en utilisant ORDER BY Rand(); comme indiqué sur tout le web cette méthode est très lente. Je l'utilise sur une base de données avec seulement 30 lignes et il faut beaucoup de temps pour retourner la valeur. La plupart des autres solutions que j'ai trouvées ne retournent qu'une seule ligne. Quel est le meilleur moyen de renvoyer plusieurs lignes aléatoires?Obtenir au hasard plusieurs lignes à partir d'une table

$get_projects_query = 
    mysql_query(
    "SELECT p_id FROM project_data WHERE p_featured='1' ORDER BY Rand() LIMIT 3" 
) or die(mysql_error()); 

while($project_row = mysql_fetch_array($get_projects_query)) {?> 
    //Do stuff 
} 
//end three random featured projects loop) 
+2

@BandonRandon - Vous devez vérifier quelle partie/méthode est lente. 'order by rand()' ne ralentirait pas sur la table avec 30 lignes seulement. – ajreal

+0

Etes-vous sûr que c'est en fait la requête qui prend autant de temps? – Gumbo

+0

@ajreal, je me demande si c'est mon serveur qui est lent alors ou le fait que je charge des images. humm ..... – BandonRandon

Répondre

1

S'il n'y a que 30 lignes, vous avez quelques autres options.

Option # 1

  1. récupérer toutes les 30 lignes.
  2. shuffle call()
  3. lu les 3 premiers de la pile

Option # 2

  1. Génération 3 nombres aléatoires de 0 à 29. Appelez-les r1, r2, r3.
  2. SELECT ... WHERE p_id IN (r1, r2, r3)

Option # 3

  1. SELECT p_id DE ...
  2. while ($ row = mysql_fetch_assoc ($ result)) $ idList [] = $ row ["p_id"];
  3. lecture aléatoire ($ idlist)
  4. SELECT ... WHERE p_id IN ($ idlist [0], $ idlist [1], idlist $ [2])
+1

L'option 2 doit supposer que les clés primaires de rangée sont séquentielles et sans lacunes. Pour un si petit nombre de rangées, l'option # 1 semble très raisonnable, même en stockant les résultats dans memcache ou similaire. – Fanis

+0

Certainement. Mais s'il n'y a que 30 lignes, vous espérez que les ID augmentent de façon monotone. –

+0

Désolé je suis assez nouveau à ce sujet, avec l'option # 3 Je suppose que $ idList est un tableau de php? – BandonRandon

0

Si vous avez seulement 30 lignes pourquoi ne pas télécharger les 30 lignes à votre client, puis générer 3 indices de lignes aléatoires

1

Sélectionnez d'abord le nombre de table. Trier par une colonne d'index (probablement la clé primaire). Sélectionnez ensuite la limite 1 avec offset = à un entier aléatoire compris entre 0 et le nombre de tables.

+0

cette méthode ne retournerait-elle pas seulement un résultat? – BandonRandon

0

Comme tout le monde dit d'autre. Ayant seulement 30 éléments dans votre requête comme cela:

  1. faire votre requête sans RAND()
  2. construire un tableau/objet avec tous les éléments - Par exemple: articles []
  3. générer 3 aléatoire nombres (x1, x2, x3) entre 1 et la longueur du tableau, puis les afficher: articles [1], les articles [2], les articles [3]

Ou votre requête a seulement pour la moment 30 résultats mais dans le temps ce sera plus grand et bigge r?

+0

En ce moment j'ai seulement 5 requêtes. C'est pour mon portefeuille, donc je ne vois pas qu'il devienne beaucoup plus grand que 30 ce serait beaucoup de projets à regarder. Je pensais 30 MAX. – BandonRandon

+0

Donc, faites comme ça. C'est simple et fonctionne à coup sûr :) –