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

Requêtes MySQL Discussion :

Select rand() MySQL avec probabilité


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 6
    Par défaut Select rand() MySQL avec probabilité
    j'ai une table de base de données (questions)avec un champ entier - appelez-le "type_id", et les valeurs de ce champ ne peuvent être que les nombres 1 à 3.

    Je souhaite de sélectionner 10 lignes aléatoire dans la base de données, avec 20% de chances que ce soit type_id= 2, 80% de chances que ce soit le type_id=1?
    j'arrive à afficher les 10 lignes aléatoire mais je veux connaitre comment ajouter la probabilité à ma requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT
     *
    FROM
      questions
    ORDER BY rand()
    LIMIT 10
    Images attachées Images attachées  

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    bonjour

    essayez ceci (pas testé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    SELECT *
    (
        SELECT *
        FROM  questions
        WHERE type_id= 2
        ORDER BY rand()
        LIMIT 20
     
        UNION ALL
     
        SELECT *
        FROM  questions
        WHERE type_id= 1
        ORDER BY rand()
        LIMIT 80
    ) T
    ORDER BY rand()
    LIMIT 10

  3. #3
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 136
    Par défaut
    Salut à tous.

    La solution se trouve dans la documentation MySql :
    --> https://dev.mysql.com/doc/refman/8.0...#function_rand

    @+

  4. #4
    Membre régulier
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 6
    Par défaut
    Merci pour vos réponse,Voila la solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (SELECT * FROM questions WHERE type_id= 2 ORDER BY rand() LIMIT 2) 
    UNION
     ( SELECT * FROM questions WHERE type_id= 1 ORDER BY rand() LIMIT 8)
     ORDER BY rand() LIMIT 10

  5. #5
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 136
    Par défaut
    Salut Sonny2017.

    Le "limit 10" est superflu dans votre requête car si dans la première sélection, vous faites "limit 2" et dans la deuxième sélection "limit 8", au total, vous aurez toujours 10 lignes.
    Il n'est pas nécessaire de mettre aussi, à la fin de votre requête, "order by rand()".
    Mettez plutôt "order by id", l'identifiant unique de votre table.

    Je constate que de vous même, vous avez trouvé le bug de la solution de aieeeuuuuu.
    Mettre des parenthèses pour chacune des sous-requêtes dans l'union.
    Sinon, j'arrive à la même conclusion que aieeeuuuuu, au sujet des proportions que vous désirez extraire de votre table.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    (
      SELECT  *
        FROM  questions
       WHERE  type_id= 2
    ORDER BY  rand()
       LIMIT  2
     
    UNION
    (
      SELECT  *
        FROM  questions
       WHERE  type_id= 1
    ORDER BY rand()
       LIMIT  8
    )
    ORDER BY  id;
    @+

  6. #6
    Membre régulier
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 34
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Octobre 2017
    Messages : 6
    Par défaut
    Oui vous avez raison Artemus24.
    Merci à vous et à aieeeuuuuu pour vos aide.

  7. #7
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Citation Envoyé par Artemus24 Voir le message
    Je constate que de vous même, vous avez trouvé le bug de la solution de aieeeuuuuu.
    Mettre des parenthèses pour chacune des sous-requêtes dans l'union.
    hé non...
    Le bug dans ma requete, c'est juste que j'ai oublié le FROMAvec la solution du [c]LIMIT 2[/] + LIMIT 8, on aura systématiquement 2 de l'un et 8 de l'autre...

    avec ma solution (après ajout du FROM), vous obtiendrez en moyenne 20% de l'un, et 80% de l'autre, c'est là qu'est la nuance. Il sera possible d'avoir 3 de l'un, et 7 de l'autre, tout en gardant les probabilités demandées dans la demande initiale.

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    et après réflexion, il y a bien plus subtil et plus performant, en évitant un couteux tri :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT  *
    FROM  questions
    WHERE  type_id in (1,2)
    ORDER BY  rand() * CASE type_id WHEN 1 THEN 1 ELSE 4 END
    LIMIT 10

  9. #9
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 136
    Par défaut
    Salut aieeeuuuuu.

    Citation Envoyé par aieeeuuuuu
    hé non... Le bug dans ma requete, c'est juste que j'ai oublié le FROM
    Je ne parle pas de l'oubli du "from", mais du champs d'action de l'order by dans l'union.

    L'order by s'applique sur la totalité de l'union et non sur la partie relative à la sous-requête. Pourquoi ?
    Parce que cela n'a pas de sens de trier seulement sur une sous-requête.

    Or le problème est d'extraire d'une manière aléatoire huit ligne ayant "type_id" = 1 et deux lignes ayant "type_id" = 2.
    Si l'on n'associe pas le "order by rand()" à chaque sous-requête, on aura toujours le même résultat à l'extraction.
    D'où le fait de mettre entre parenthèse chaque sous-requête ayant son propre "order by rand()".

    Citation Envoyé par Sonny2017
    Je souhaite sélectionner 10 lignes aléatoires dans la base de données, avec 20% de chances que ce soit type_id= 2, 80% de chances que ce soit le type_id=1?
    Il y a une ambiguïté sur cette phrase.

    J'interprète cela comme quoi je dois extraire deux lignes pour type_id = 2 et huit lignes pour type_id = 1.

    Si l'on applique le pourcentage pour chaque cas, on peut très bien se retrouver avec 100% pour type_id = 2 ou 100% pour type_id = 1.
    Avec bien sûr, en moyenne, sur un nombre infini d'échantillon 80% pour type_id = 2 et 80% pour type_id = 1.

    Votre seconde solution, qui est très bien, répond à un comportement aléatoire, stricto sensu de la question posée.

    Maintenant, je préfère plutôt votre première solution.

    @+

  10. #10
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    Comme je l'avais indiqué, je n'avais pas testé ma première requête, c'était plus pour l'idée...

    Après correction pour une syntaxe admiss par MySQL, elle s’écrit donc comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    SELECT *
    FROM (
        SELECT * 
        FROM (
    		SELECT *
    		FROM  questions
    		WHERE type_id= 2
    		ORDER BY rand()
    		LIMIT 20
    	) AS A
      UNION ALL
    	SELECT * 
        FROM (
    		SELECT *
    		FROM  questions
    		WHERE type_id= 1
    		ORDER BY rand()
    		LIMIT 80
        ) AS B
    ) T
    ORDER BY rand()
    LIMIT 10;
    Concernant ma dernière proposition, au niveau performances, elle a l'avantage d'éviter un scane de table et un tri supplémentaire...
    en revanche, d'un point de vue fonctionnel, la probabilité d'avoir une ligne de type 1 dépendra en fait du rapport entre le nombre de lignes de type 1 et le nombre de lignes de type 2 : s'il y a quatre fois plus de lignes de type 2 que de lignes de type 1, alors on aura en fait 50% de type 1 et 50% de type 2 dans le résultat final...

  11. #11
    Membre prolifique Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    7 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 7 136
    Par défaut
    Merci aieeeuuuuu pour cette précision.

    @+

Discussions similaires

  1. Réponses: 0
    Dernier message: 14/08/2014, 17h23
  2. [MySQL] éviter doublon avec rand() mysql
    Par Invité(e) dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 30/05/2011, 15h01
  3. Réponses: 4
    Dernier message: 24/11/2006, 17h57
  4. Problème avec select sous MYSQL
    Par Thomad dans le forum Langage SQL
    Réponses: 2
    Dernier message: 26/01/2006, 12h26
  5. Requete MySQL avec un Rand sur une table
    Par tom06440 dans le forum Requêtes
    Réponses: 2
    Dernier message: 05/01/2006, 18h37

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