Tirage au sort en respectant certaines conditions

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Tirage au sort en respectant certaines conditions

Re: Tirage au sort en respectant certaines conditions

par street51 » 26 janv. 2017, 16:22

Arf, c'est vrai que c'est plus malin de faire comme ça... Merci !

Re: Tirage au sort en respectant certaines conditions

par moogli » 26 janv. 2017, 16:00

non tu va comparer une chaîne de caractère à (je suppose) un entier cela ne risque pas de fonctionner.
tu as un SGBD utilise correctement :)
pour cela ajoute une table calendier_indispo dans laquel tu met l'id de la ligne du calendrier et l'id de la personne (la clef primaire c'est les deux colonnes).
tu pourras ainsi selectionner de façon simple les id indispo pour la ligne que tu souhaites (c'est automatique si tu veux plusieurs lignes ;) )


@+

Re: Tirage au sort en respectant certaines conditions

par street51 » 26 janv. 2017, 15:50

Merci.

J'ignorais qu'on pouvait utiliser des sous-requêtes !

En effet j'utilise un champ "indispo" qui contient plusieurs id (séparés par un espace), qui s'ajoutent ou se retirent selon que la personne se coche ou se décoche comme étant indisponible (sur un agenda personnel).

Du coup une requête de ce genre ne fonctionnerait pas ?
select id from personnes where id not in (select astreinte_id from calendrier where ladate='hier') and id not in (select indispo from calendrier where ladate='aujourdhui')

Re: Tirage au sort en respectant certaines conditions

par moogli » 26 janv. 2017, 15:44

salut,

quand tu dis
mais aussi les id des gens qui ne peuvent pas travailler ce jour-là (champ "indispo").
tu veux dire que tu as un champs dans lequel tu mets plusieurs id (genre séparé par une virgule) ?
si oui oublie c'est un mauvaise idée.

pour sélectionner en fonction de table différente utilise des sous requête
select id from personnes where id not in (select astreint_id from calendrier where ladate='hier')
-- si tu utilises mysql ajoute : order by rand() limit 1 et le tour est joué.
sinon effectivement tu récupères tous les id de la requête dans un tableau et fait un rand pour prendre une clef au pif.

tu vas aussi ajouter une condition dans la requête pour les indispositions (si c'est dans une table c'est plus simple).

@+

Re: Tirage au sort en respectant certaines conditions

par street51 » 26 janv. 2017, 14:48

Merci pour ta réponse.

Oui, en gros j'ai :
- une première table "calendrier" contenant la date (un id unique, la date en format US, le jour de la semaine, le mois, etc. pour extraire facilement ces infos quand j'ai besoin de les afficher), l'id de la personne qui travaille le jour correspondant (champ "astreinte"), mais aussi les id des gens qui ne peuvent pas travailler ce jour-là (champ "indispo").
- une seconde table "personnes" contenant la liste des personnes susceptibles de travailler (un id unique, un champ "astreintes" pour savoir s'il est susceptible d'être tiré au sort, et d'autres infos)

Du coup, je ne vois pas comment récupérer en une seule requête SQL l'id d'une personne qui soit différent de l'id de la personne ayant bossé la veille, sachant que ces deux informations sont stockées dans deux tables différentes. C'est pourquoi je passais par un array.

Je souhaiterais donc :
- Sélectionner au hasard l'id d'une personne réalisant des astreintes
- Vérifier que cette personne ne travaillait pas déjà la veille
- Vérifier que cette personne n'est pas indisponible ce jour
- Si ces conditions sont remplies, je peux modifier la BDD pour mettre l'id de la personne à la date correspondante ; sinon, effectuer un nouveau tirage au sort et vérifier à nouveau ces conditions (qui sont à nouveau susceptibles de ne pas être remplies, etc.)

Pour l'histoire des personnes choisies selon le jour de la semaine (untel ne souhaitant pas travailler le lundi, par exemple) , je pense qu'il est plus simple de passer par mon champ "indispo" plutôt que par une règle à l'intérieur de la boucle (du genre if($id_personne == '1' && $jour == 'lundi')...).

J'espère avoir été plus clair...

Re: Tirage au sort en respectant certaines conditions

par kevin254kl » 26 janv. 2017, 13:31

Bonjour,

L'information ou tu vérifies si le numéro à était tiré le jour précédent est stocké en base? Pourquoi ne pas sélectionner le numéro directement en base plutôt que récupérer une liste et ensuite filtrer. Tu filtres dans ta requête sql, il existe aussi la fonction random(), pour l'id selon le jour de la semaine si tu pouvais donner plus d'information.

Tirage au sort en respectant certaines conditions

par street51 » 26 janv. 2017, 12:06

Bonjour,

Je souhaiterais réaliser un tirage au sort parmi plusieurs éléments, puis vérifier que certaines conditions sont bien remplies pour valider le résultat et, si ce n'est pas le cas, effectuer un nouveau tirage (etc.).

Le but est de répartir aléatoirement un élément par jour sur un planning.

J'ai une liste de nombres (correspondant à des id dans une table) que je récupère sous la forme d'un tableau. J'effectue un array_rand pour sélectionner un id au hasard. Dans certaines circonstances (jour de la semaine pour un id déterminé, ou si l'id a déjà été tiré au sort sur le jour précédent) je souhaiterais effectuer un nouveau tirage au sort, et vérifier à nouveau si les conditions sont respectées, etc. Ce n'est qu'une fois qu'un id remplira toutes les conditions que la boucle s'arrête (avec une requête SQL pour l'insérer dans la BDD). C'est cette partie qui me pose problème : je ne vois pas quelle boucle utiliser pour le résoudre...

Merci pour votre aide.