begin process at 2012 05 31 10:37:41
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Base de données

 > 

MySQL

 > 

Tirage au sort aléatoire pondéré dans une requête SQL


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Tirage au sort aléatoire pondéré dans une requête SQL

jeudi 24 juillet 2008 à 13:41:33 | Tirage au sort aléatoire pondéré dans une requête SQL

Evangun

Bonjour à tous,

je vous soumets une petite colle ! du genre qui fait cogiter, sauf si vous êtes superman.

Il s'agit de trouver une requête SQL qui ferait un tirage au sort pondéré. Je ne demande pas de script php qui fasse ça, je connais déjà bien. Ce que je veux c'est vraiment que SQL me renvoie le résultat.

Dans ma table j'ai des lignes, et chaque ligne contient dans un champ son coefficient de pondération, c'est-à-dire le pourcentage de chance qu'elle a d'être tirée.

Par exemple

# de ligne         #coefficient
Ligne 1 :          34
Ligne 2 :          33
Ligne 3 :          33

Jusqu'à présent je n'ai rien trouvé. Je me dis que la seule solution c'est de rajouter deux champs, qui me permettront d'utiliser un nombre aléatoire avec RAND tiré entre 1 et 100.
Exemple des lignes :

# de ligne         #coefficient     #debutdeplage         #findeplage
Ligne 1 :          34                   1                             34
Ligne 2 :          33                   35                           57
Ligne 3 :          33                   58                           100

Si vous avez une idée n'hésitez pas !
Merci
jeudi 24 juillet 2008 à 13:43:09 | Re : Tirage au sort aléatoire pondéré dans une requête SQL

Evangun

Je me rends compte que mon exemple est idiot puisque les 3 ont la même chance d'être tiré ou presque : 1/3, mais vous avez compris ce que je voulais dire
jeudi 24 juillet 2008 à 19:07:55 | Re : Tirage au sort aléatoire pondéré dans une requête SQL

coucou747

Administrateur CodeS-SourceS
Réponse acceptée !
salut

on va prendre un truc un peu moins aleatoire :

# de ligne         #coefficient
Ligne 1 :          20
Ligne 2 :          20
Ligne 3 :          60

mysql> CREATE DATABASE test
    -> ;
Query OK, 1 row affected (0.11 sec)

mysql> USE test
Database changedmysql> CREATE TABLE foo (id int unsigned auto_increment, ligne char(5), pourcent int, primary key(id));
Query OK, 0 rows affected (0.01 sec)

mysql> INSERT INTO foo(ligne, pourcent) VALUES ("l1", 20), ("l2", 20), ("l3", 60);
Query OK, 3 rows affected (0.04 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> SELECT * FROM foo;
+----+-------+----------+
| id | ligne | pourcent |
+----+-------+----------+
|  1 | l1    |       20 |
|  2 | l2    |       20 |
|  3 | l3    |       60 |
+----+-------+----------+
3 rows in set (0.00 sec)

mysql> SELECT ligne, (SELECT SUM(pourcent) FROM foo AS b WHERE b.id <= a.id) FROM foo AS a;
+-------+---------------------------------------------------------+
| ligne | (SELECT SUM(pourcent) FROM foo AS b WHERE b.id <= a.id) |
+-------+---------------------------------------------------------+
| l1    |                                                      20 |
| l2    |                                                      40 |
| l3    |                                                     100 |
+-------+---------------------------------------------------------+
3 rows in set (0.00 sec)

ensuite, en bidouillant un peu, on arrive a faire ca :

mysql> SET @random = ROUND(RAND() * 100);
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @random AS rand, (SELECT ligne FROM (SELECT id, ligne, (SELECT SUM(pourcent) FROM foo AS b WHERE b.id <= a.id) AS percent FROM foo AS a) AS sub WHERE percent > rand ORDER BY id ASC LIMIT 1) AS ligne;
+------+-------+
| rand | ligne |
+------+-------+
| 99   | l3    |
+------+-------+
1 row in set (0.00 sec)


chaque fois que j'ai tente de combiner les deux, mysql fout sa merde...
jeudi 24 juillet 2008 à 21:02:42 | Re : Tirage au sort aléatoire pondéré dans une requête SQL

Evangun

Hello et merci de t'être penché sur le problème !
C'est bizarre, mysql me met une erreur lorsque je veux faire ta deuxième requête select. Je suis en train de mettre la mise à jour de mysql, peut-être qu'il faut la dernière version pour pouvoir la faire.
En tout cas c'est très intéressant ton idée et je travaillerai sur cette base demain, là je dois partir. Je vous tiendrai au courant.
Merci encore et bonne soirée
jeudi 24 juillet 2008 à 21:04:52 | Re : Tirage au sort aléatoire pondéré dans une requête SQL

coucou747

Administrateur CodeS-SourceS
mysql> SELECT VERSION();
+--------------------+
| VERSION()          |
+--------------------+
| 5.0.51a-3ubuntu5.1 |
+--------------------+
1 row in set (0.00 sec)

vendredi 25 juillet 2008 à 12:44:39 | Re : Tirage au sort aléatoire pondéré dans une requête SQL

Evangun

Hello,

effectivement avec la 5.0.51 ça marche mieux qu'avec la 5.0.27 ! Reste à savoir si je peux disposer de cette version sur mon hébergement qui est mutualisé pour l'instant.
Bon alors félicitations, ça marche nickel !

Pour l'histoire de combiner les deux, oui j'imagine que le problème c'est que mettre un alias au RAND ne suffit pas pour en faire une constante et qu'elle est donc recalculée à chaque sous-requête.

Merci beaucoup pour le coup de main, je n'y aurais pas pensé !
à+
samedi 26 juillet 2008 à 02:33:33 | Re : Tirage au sort aléatoire pondéré dans une requête SQL

Evangun

Pour info à ceux qui tomberont sur ce message, on ne peut vraiment pas faire confiance à RAND de MySQL pour trouver un nombre aléatoire. Les résultats sont complètement faussés par rapport aux pondérations. Avec un random fourni par php par contre, tout marche bien.


Cette discussion est classée dans : ligne, aléatoire, sql, tirage, sort


Répondre à ce message

Sujets en rapport avec ce message

Au secours !!!! [ par eowene ] Bonjour à tous. J'ai un problème et je ne comprends pas du tout d'où il vient.Voilà le principe...Je recherche un nom dans une base de données. Pour c Au secours [ par eowene ] Bonjour à tous. J'ai un problème et je ne comprends pas du tout d'où il vient.Voilà le principe...Je recherche un nom dans une base de données. Pour c petit probleme SQL [ par Clonk ] bonjour,voilà, j'ai une première page où je liste des nom et où je crée un lien direct vers une autre page, genre:while($ligne=mysql_fetch_object($res passer une ligne lors d'un formulaire PHP/SQL [ par jiojioforever ] j'ai un formulaire de type textarena et je mets le contenu dans un champ d'un tablemais pour remplir le formulaire j'ai besoin de passer des lignes... tirage aléatoire et affichage pour un temps donnée [ par titeuf974 ] Bonjour!Voila. J'ai une requète qui extrait une infomation aléatoire d'une base données pour l'afficher sur une page. Cela marche très bien. A chaque Tirage au sort [ par adrien334 ] Bonjour Je vien vous poser une petite question car là je trouve rien dutout Savez vous comment je pourais faire pour effectué un tirag au sort ent insertion des donnée dans une table [ par shumi_shumi ] salut , mon probleme c'est que je veux remplir une table à partir d'un fichier qui contient un ensemble des numero de telephones mon code est le suiva afficher les resultats d'une requete sql avec X resultat par ligne [ par loupile ] bonjour, alors voila je vous explique, j'ai une requête qui va chercher 6 images dans une base et je voudrais les afficher et 2 lignes de 3 images ... GROS SOUCI TRES URGENT : Tirage au sort php [ par bastien211 ] Bonjour, je m'appelle Bastien je suis graphiste et j'essaye de faire un tirage au sort en PHP, comme vous l'aurez deviner , vu que je suis graphiste j une ligne mysql dans une case de tableau [ par bubbledesavon ] bonjour,je me permet d'ecrire car je n'arrive pas a trouver de correspondance a ce que je recherche.j'ai une table mysql "id,nom,descriptif,image,nume


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,515 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales