Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 23/10/2007, 11h24   #1
Membre éclairé
 
Avatar de Linio
 
Inscription : octobre 2005
Messages : 427
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 427
Points : 304
Points : 304
Par défaut Random sur une base?

Bonjour à tous!

Je suis passé d'une base PGSql à une base MySQL, et j'avoue que même si le changement est appréciable, j'aimais bien en SQL la fonction RANDOM:

Code :
SELECT id FROM matable ORDER BY RANDOM();
Qui me permettait de récupérer aléatoirement des champs en table.

Une autre façon de le faire (je travaille en php et aimerait éviter de tracter toute ma table pour faire un random sur 1/100ème des lignes)
__________________
Linio
Linio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2007, 08h55   #2
Membre éclairé
 
Avatar de Linio
 
Inscription : octobre 2005
Messages : 427
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 427
Points : 304
Points : 304
Dois je en déduire que ça n'est pas faisable?
__________________
Linio
Linio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2007, 09h21   #3
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Si c'est cela est possible. Je l'ai déjà utilisé pour un enregistrement pris au hasard.
Citation:
#

RAND(), RAND(N)

Retourne un nombre aléatoire à virgule flottante compris dans l'intervalle 0 - 1.0. Si l'argument entier N est spécifié, il est utilisé comme initialisation du générateur de nombres aléatoires.

mysql> SELECT RAND();
-> 0.9233482386203
mysql> SELECT RAND(20);
-> 0.15888261251047
mysql> SELECT RAND(20);
-> 0.15888261251047
mysql> SELECT RAND();
-> 0.63553050033332
mysql> SELECT RAND();
-> 0.70100469486881

Vous ne pouvez pas utiliser une colonne de valeur RAND() dans une clause ORDER BY, parce que ORDER BY va évaluer la colonne plusieurs fois. Dans la version 3.23 de MySQL, vous pouvez, tout de même, faire ceci :

mysql> SELECT * FROM tbl_name ORDER BY RAND();

Cette syntaxe est très pratique pour faire une sélection aléatoire de lignes :

mysql> SELECT * FROM table1, table2 WHERE a=b AND c<d
-> ORDER BY RAND() LIMIT 1000;

Notez que la fonction RAND() dans une clause WHERE sera réévaluée à chaque fois que WHERE sera exécuté.

RAND() n'est pas un générateur parfait de nombres aléatoires, mais reste une manière rapide de produire des nombres aléatoires portables selon les différentes plates-formes pour une même version de MySQL.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2007, 12h05   #4
Membre éclairé
 
Avatar de Linio
 
Inscription : octobre 2005
Messages : 427
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 427
Points : 304
Points : 304
Citation:
Envoyé par berceker united Voir le message
Notez que la fonction RAND() dans une clause WHERE sera réévaluée à chaque fois que WHERE sera exécuté.
Dois je m'inquiéter au niveau des perfs?
Est ce que ça veut dire que pour chaque ligne le rand est refait?

Parce que le but est justement de tirer une cinquantaine de lignes d'une base qui peut en contenir plusieurs dizaines de milliers (pour éviter à avoir un traitement à faire sur ces dizaines de milliers), à savoir le fais-je du coup plutôt en PHP ou en MySQL ?
__________________
Linio
Linio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2007, 12h15   #5
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Citation:
Envoyé par Linio Voir le message
Dois je m'inquiéter au niveau des perfs?
Est ce que ça veut dire que pour chaque ligne le rand est refait?

Parce que le but est justement de tirer une cinquantaine de lignes d'une base qui peut en contenir plusieurs dizaines de milliers (pour éviter à avoir un traitement à faire sur ces dizaines de milliers), à savoir le fais-je du coup plutôt en PHP ou en MySQL ?
Si tu veux optimiser je peux te conseiller de le faire en deux requête.
Code :
1
2
SELECT id FROM maTable ORDER BY Rand() LIMIT 50;
SELECT * FROM maTable WHERE id IN(/*le résultat de la premiere requête*/)
Il est pas possible de mettre un sous requête ayant un LIMIT
Mais en gros la premiere va récupérer les informations très rapidement. Au second il execute seulement sur le jeux de résultat précédement.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2007, 12h25   #6
Membre éclairé
 
Avatar de Linio
 
Inscription : octobre 2005
Messages : 427
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 427
Points : 304
Points : 304
Hmmm... donc en terme de perf c'est effectivement pas optimal...

Bon bon, merci pour les éclaircissements, je vais tâcher d'analyser tout ça.

Bizarre tout de même qu'il n'y ait pas en SQL quelque chose pour tirer aléatoirement des lignes...
__________________
Linio
Linio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2007, 12h31   #7
Expert Confirmé
 
Avatar de berceker united
 
Développeur informatique
Inscription : février 2005
Messages : 2 982
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : février 2005
Messages : 2 982
Points : 3 567
Points : 3 567
Citation:
Envoyé par Linio Voir le message
Hmmm... donc en terme de perf c'est effectivement pas optimal...

Bon bon, merci pour les éclaircissements, je vais tâcher d'analyser tout ça.

Bizarre tout de même qu'il n'y ait pas en SQL quelque chose pour tirer aléatoirement des lignes...
Si il existe c'est ORDER BY RAND() LIMIT 50;

Regarde si les performances sont correcte ou non.
__________________
Mon avatar ? Ce n'est rien, c'est juste la tête que je fais lorsque je vois un code complètement frappa dingue !...
berceker united est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/10/2007, 13h28   #8
Membre éclairé
 
Avatar de Linio
 
Inscription : octobre 2005
Messages : 427
Détails du profil
Informations forums :
Inscription : octobre 2005
Messages : 427
Points : 304
Points : 304
Je vais regarder ce soir quand j'aurais accès à ma BD.

En fait le RAND() est donc dispo de la même manière sur PGsql et MySql.

Mais j'avoue n'avoir jamais testé en terme de perf, je vais en parler à mon admin système.

Merci en tout cas, j'avais été mal renseigné sur l'inexistence de cette fonction (bien qu'il me semble l'avoir testé par acquis de conscience et que ça ne marchait pas, je vais vérifier ce soir ce que je peux en tirer).
__________________
Linio
Linio est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h02.


 
 
 
 
Partenaires

Hébergement Web