2010-09-15 6 views
1

J'utilise le code suivant pour renvoyer une ligne aléatoire d'une table. En utilisant le champ 'rand'.Récupération de lignes aléatoires à l'aide d'un index aléatoire et RAND()

SELECT * 
FROM imgs 
WHERE rand > RAND() 
ORDER BY rand ASC 
LIMIT 1 

est généré « rand » Le champ par MySQL à la création en utilisant quelque chose de similaire à:

INSERT INTO imgs SET rand = RAND() 

Pour une raison quelconque les résultats bien que le changement de chaque course sont uniquement les lignes avec un champ très faible « rand » . Il y a certainement une gamme complète avec plus de 7 000 lignes. Coutures fonctionner correctement si je remplace le 'OU rand> RAND()' avec 'OÙ rand> [un nombre compris entre 0-1]'

+0

En plus de cela, il ne s'adapte pas bien à 100K + lignes, pourquoi pas seulement utiliser 'ORDER BY RAND()'? –

+0

Essaie de développer un système très optimisé pour un client dont le besoin pousse régulièrement mon serveur partagé à la limite. La solution évidente serait de générer le flottant aléatoire dans php, mais les coutures plus logique de le faire dans l'instruction SQL. –

Répondre

0

RAND() génère une valeur à virgule flottante x 0 où x = < < 1,0 .. Pour générer un plus grand nombre (nombre entier), utilisez FLOOR(y + (RAND() * z)) qui génèrera une valeur x où y < = x < (y + z)

+0

Je sais. Le problème est pour une raison quelconque dans le contexte de 'WHERE' il ne semble pas que générer correctement un nombre à virgule flottante entre 0-1. RAND() est utilisé pour générer la colonne à l'étape d'insertion –