Accueil > Forum > > > > Tirage au sort aléatoire pondéré dans une requête SQL
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
|
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
|
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
Livres en rapport
|
Derniers Blogs
ROSLYN FLUENT APIS: ROSLYNHELPER NUGET PACKAGEROSLYN FLUENT APIS: ROSLYNHELPER NUGET PACKAGE par Matthieu MEZIL
Si vous utilisez Roslyn et que vous vous voulez vous simplifier le code du code rewriter, je vous conseille d'installer mon NuGet package RoslynHelper ....(read more) ...
Cliquez pour lire la suite de l'article par Matthieu MEZIL POUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDNPOUR RAPPEL ! LES SPéCIFICATIONS DES PROTOCOLES OFFICE ET SHAREPOINT SONT DISPONIBLES SUR MSDN par neodante
Quelle est le point commun entre : Microsoft il y a 10 ans et Apple aujourd'hui ? Réponse: avoir une politique de protocoles propriétaires et fermés :) Car pour rappel (si si je vous assure c'est important de le rappeler), la majorité des spécifications e...
Cliquez pour lire la suite de l'article par neodante JOYEUX ANNIVERSAIRE NIXJOYEUX ANNIVERSAIRE NIX par ebartsoft
Souhaitons un bon et joyeux anniversaire à notre hôte à tous, Nix.
Je ne le répéterais jamais assez mais sans lui rien ne serait possible. Il défit en permanence les lois de la gravité et comme il le dit si bien, si tu lui fais confiance ça devra...
Cliquez pour lire la suite de l'article par ebartsoft IMAGINE CUP 2012, MAKE A SIGN EN FINALEIMAGINE CUP 2012, MAKE A SIGN EN FINALE par junarnoalg
Voilà qui est fait, la nouvelle est officielle ! L'équipe belge "Make a Sign" va au pays des kangourous défendre son projet dans la catégorie Software Design. http://www.imaginecup.com/CompetitionsContent/Competition/WorldwideFinalists.aspx V...
Cliquez pour lire la suite de l'article par junarnoalg KINECT 1.5 IS OUT !KINECT 1.5 IS OUT ! par Vko
La version 1.5 du Kinect For Microsoft vient tout juste de sortir ! Plein de nouveautés: Tracking de squelette en Near Mode Détection en position assise Détection faciale avec un SDK dédié Documentation et des guideline (enfin) Un out...
Cliquez pour lire la suite de l'article par Vko
Logiciels
sDEVIS-FACTURES vlPRO (8.1.0.3)SDEVIS-FACTURES VLPRO (8.1.0.3)sDEVIS-FACTURES vlPRO a été mis au point pour les particuliers, créateurs, entrepreneurs, artisa... Cliquez pour télécharger sDEVIS-FACTURES vlPRO 974 Application Server (12.2.4.6)974 APPLICATION SERVER (12.2.4.6)Développez de puissantes applications dans un environnement de 'cloud computing', clusterisé, séc... Cliquez pour télécharger 974 Application Server vPicture (1.4.2.1)VPICTURE (1.4.2.1)Avec vPicture, hébergez vos images facilement et rapidement.
vPicture est un utilitaire simple, ... Cliquez pour télécharger vPicture Easy-Planning (2.2.1.6)EASY-PLANNING (2.2.1.6)Easy-Planning permet de créer des plannings sous la représentation de diagrammes et est adapté au... Cliquez pour télécharger Easy-Planning COM-BACKUP (2.0)COM-BACKUP (2.0)
COM-BACKUP est un logiciel de sauvegarde qui permet de planifier les sauvegardes de vos dossiers ...
Cliquez pour télécharger COM-BACKUP
|