2013-05-31 4 views
1

J'ai des problèmes avec ma requête pour sélectionner 100 lignes aléatoires d'une base de données avec 50k de lignes.Plusieurs lignes alternatives pour RAND()

D'abord je n'ai utilisé que la fonction RAND() mais c'est devenu trop lent.

Maintenant, je me sers de cette requête:

$query = mysql_query("SELECT t1.* FROM users AS t1 JOIN (SELECT ROUND(RAND() * (SELECT MAX(id) FROM users WHERE picture != '' && age <= 50 && age >= 18 && username != '')) AS id) AS t2 WHERE picture != '' && age <= 50 && age >= 18 && username != '' && t1.id >= t2.id LIMIT 100"); 
while($q = mysql_fetch_assoc($query)) 
{ echo $q['id'].'<br>'; } 

Mais parfois, il donne un tas de lignes vides. Est-ce que quelqu'un peut me dire ce qui ne va pas?

Merci!

MISE À JOUR J'essaie cette requête aussi, mais cela me donne une erreur.

$query = mysql_query("SELECT id FLOOR(1 + RAND() * x.m_id) 'rand_ind' FROM users (SELECT MAX(t.id) - 1 'm_id' FROM users t) x WHERE picture != '' && age <= 50 && age >= 18 && username != '' ORDER BY rand_ind LIMIT 100"); 

mysql_fetch_assoc(): argument fourni est pas un résultat MySQL ressource

+0

Obtenir toutes les lignes dans n'importe quel ordre, puis le mélanger en PHP (ou en prendre quelques unes au hasard dans le tableau résultant) pourrait être la bonne approche. –

+0

@MadaraUchiha, en sélectionnant 50k lignes lorsque nous avons besoin de seulement 100 n'est pas une très bonne idée –

+1

@ v2p: N'avez pas bien lu, mon mauvais, vous avez raison. –

Répondre

-1

Vous pouvez utiliser:

SELECT ... FROM ... LIMIT $rand,100 

$rand est un nombre aléatoire généré (0-50k) de côté code

+2

Malheureusement, seul le premier élément serait aléatoire, le reste est quasi aléatoire au mieux. –

+0

oui, le groupe de 100 lignes est aléatoire non chaque ligne – Stephan

+0

de toute façon si la limite serait 2000,100 alors tous les 100 utilisateurs suivants n'ont pas les filtres que j'utilise dans '" WHERE picture! = '' && age <= 50 && age> = 18 && nom d'utilisateur! = '' "' – user2370950

1

Aléatoire la commande avec RAND(), puis sélectionnez simplement la limite 0,100

order by rand() limit 0,100

moyen le plus rapide de le faire dans mysql

Vous pouvez lire ceci pour des alternatives http://jan.kneschke.de/projects/mysql/order-by-rand/ Il y a des limites à faire les moyens proposés dans cet article si

1

Si votre Les identifiants de la table sont séquentiels, pourquoi ne pas simplement générer des nombres aléatoires entre 0 et "max_rows".

faire quelque chose comme

'SELECT ... FROM .... WHERE id in (' . implode(',', $randomNumbers) . ')';

Il retournera les lignes avec l'identifiant généré de.