IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Procédural MySQL Discussion :

Random sur une base?


Sujet :

SQL Procédural MySQL

  1. #1
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  2. #2
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    Dois je en déduire que ça n'est pas faisable?

  3. #3
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 504
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 504
    Par défaut
    Si c'est cela est possible. Je l'ai déjà utilisé pour un enregistrement pris au hasard.
    #

    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.

  4. #4
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    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 ?

  5. #5
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 504
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 504
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    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...

  7. #7
    Membre éprouvé
    Avatar de berceker united
    Profil pro
    SQL
    Inscrit en
    Février 2005
    Messages
    3 504
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : SQL
    Secteur : Finance

    Informations forums :
    Inscription : Février 2005
    Messages : 3 504
    Par défaut
    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.

  8. #8
    Membre éclairé Avatar de Linio
    Inscrit en
    Octobre 2005
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 431
    Par défaut
    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).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. requetes BUSINESS OBJECT sur une base ACCESS
    Par greatmaster1971 dans le forum Deski
    Réponses: 1
    Dernier message: 06/10/2004, 14h10
  2. [ADO][excel] clé primaire sur une base excel
    Par mandale dans le forum Bases de données
    Réponses: 3
    Dernier message: 02/09/2004, 17h53
  3. Connexion SYSDBA sur une base ou une autre
    Par jack554 dans le forum Administration
    Réponses: 11
    Dernier message: 20/04/2004, 17h11
  4. Filtre sur une base Paradox
    Par mika dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/03/2004, 11h51
  5. Alter user sur une base distante
    Par bilo2000 dans le forum Administration
    Réponses: 13
    Dernier message: 09/03/2004, 17h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo