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 random avec non équi-probabilité


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Select random avec non équi-probabilité
    Bonjour, je m'explique !

    Imaginons une table contenant des références à des banners, j'aimerais pouvoir en privilégier certaines lors du tirage au sort de celle qui va s'afficher sur le site...

    Dans mes champs, j'ajoute "occurrence" avec une valeur 1, 2 ou 3
    1 pour dire que la banner a autant de chances que les autres de sortir
    2 pour dire que la banner a deux fois plus de chances de sortir
    3 pour dire que la banner a trois fois plus de chances de sortir

    Quelle requête faut-il rédiger pour que cela fonctionne ? J'avoue que je sèche.

    On part sur la base de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM banner ORDER BY Rand() LIMIT 1
    Mais après ?

    Est-ce possible ? Merci d'avance à ceux qui auront une idée !

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 743
    Points
    11 743
    Par défaut
    Je te propose de créer la table suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE XCartesien (Occ INT) ;
    INSERT INTO XCartesion (Occ) VALUES (1) ;
    INSERT INTO XCartesion (Occ) VALUES (2) ;
    INSERT INTO XCartesion (Occ) VALUES (2) ;
    INSERT INTO XCartesion (Occ) VALUES (3) ;
    INSERT INTO XCartesion (Occ) VALUES (3) ;
    INSERT INTO XCartesion (Occ) VALUES (3) ;
    Tu peux maintenant faire ta requête ainsi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT B.* 
    FROM banner B
      inner join XCartesien X on B.Occurence = X.Occ
    ORDER BY Rand() 
    LIMIT 1
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 10
    Points : 6
    Points
    6
    Par défaut Merci !
    Merci pour la réponse nette et précise, je n'ai pas eu l'occasion de tester encore, mais je suis reconnaissant pour ta rapidité à résoudre mes problèmes. Encore merci

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 743
    Points
    11 743
    Par défaut
    Variante plus élégante :

    Tu utilises la table Chiffres (pratique dans pas mal d'astuces de ce genre) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE TABLE chiffres (
      Num tinyint(1) unsigned NOT NULL
    ) ;
     
    INSERT INTO chiffres(Num) VALUES (0);
    INSERT INTO chiffres(Num) VALUES (1);
    INSERT INTO chiffres(Num) VALUES (2);
    INSERT INTO chiffres(Num) VALUES (3);
    INSERT INTO chiffres(Num) VALUES (4);
    INSERT INTO chiffres(Num) VALUES (5);
    INSERT INTO chiffres(Num) VALUES (6);
    INSERT INTO chiffres(Num) VALUES (7);
    INSERT INTO chiffres(Num) VALUES (8);
    INSERT INTO chiffres(Num) VALUES (9);
    La requête devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT B.* 
    FROM banner B
      INNER JOIN Chiffres C ON B.Occurence >= C.Num
    ORDER BY Rand() 
    LIMIT 1
    Antoun
    Expert Tableau, Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

Discussions similaires

  1. [XL-2007] VBA Selection find avec valeur non trouvé
    Par WAS92 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2013, 15h02
  2. Réponses: 4
    Dernier message: 04/12/2012, 12h51
  3. [MySQL] Select Random avec poids
    Par morgan47 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 15/09/2009, 21h09
  4. Select case avec then qui retourne une variable
    Par dinette dans le forum SQL
    Réponses: 6
    Dernier message: 06/07/2009, 11h03
  5. Liste <select> avec onchange qui ne change pas
    Par whitespirit dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 09/05/2008, 10h45

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