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 :

Requête ordonnancement conditionnelle


Sujet :

Requêtes MySQL

  1. #1
    Invité
    Invité(e)
    Par défaut Requête ordonnancement conditionnelle
    Bonjour à tous,

    Je vais volontairement simplifier mon problème afin de le rendre plus explicable et plus compréhensible.

    J'ai des chiffres de 1 à 5.
    Chaque "client" tirera un de ces chiffres sous les conditions suivantes :
    - Une répartition uniforme des clients (condition sine qua non)
    - Minimiser l'écart entre la valeur passée en paramètre et les chiffres dispo (mais toujours supérieur en revenant à 1 quand on est à 5).
    Ex 1 :
    Val            1     2     3     4     5
    Occurence      1     1     1     2     2
    Param = 1            x
    Param = 4      x
    
    Ex 2 :
    Val            1     2     3     4     5
    Occurence      2     2     1     2     2
    Param = 4                  x
    
    Espérant avoir été clair et recevoir quelques réponses inspirées ;-)

    Merci
    Dernière modification par ok.Idriss ; 16/05/2012 à 13h04. Motif: SMS à éviter

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    C'est pas gagné. Personnellement, je n'y comprends rien.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Invité
    Invité(e)
    Par défaut
    Un petit complément alors :
    Ex1 - param = 1 :
    Les chiffres dont l'occurrence sont mini = 1,2,3
    Et dans ceux-là, celui qui est le + proche de 1 => 2

    Ex1 - param = 4 :
    Les chiffres dont l'occurrence sont mini = 1,2,3
    Je ne peux prendre 5 car son occurrence (son nb de clients) n'est pas minimal (=1)
    Après 5, je boucle sur 1 (1,2,3,4,5,1,2,3,4,5,1,2,...)
    Le premier chiffre libre dont l'occurrence est minimale est donc 1.

    Ex2 - param = 3 :
    Le chiffre dont l'occurrence est mini = 3
    Donc forcément 3 !

    Espérant être plus clair.

    Merci

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    et si tu nous présentais ton problème sans le simplifier et avec plus de phrases et moins de formules les codant...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Tiens ericd69.. Je te connais toi.

    Je reformule donc à nouveau sans simplification

    Je dois répartir uniformément les requêtes récurrentes (timer) des "clients" sur une plage d'1 heure en minimisant le temps entre la demande et la réponse.

    Je dois donc trouver la minute pour laquelle le nb de connexions n'est pas à son maximum et qui minimisera le délai d'attente.
    Ex : Demande à 9h25 -> réponse à 10h12 puis 11h12 puis 12h12, ...
    Donc ici je cherche le chiffre 12

    Je posterais sous peu une ébauche de solution.
    Peut-être cela aidera-t-il à la compréhension.

  6. #6
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    déjà c'est plus clair

    montre la structure de la table où tu fais ta recherche et et un éventuel jeu de données...

    comme on le répète souvent faut pas essayer de simplifier car c'est le meilleur moyen pour ne pas avoir la bonne réponse... et toujours fournir de quoi bidouiller...
    soyons pensez à mettre quand votre problème est résolu ou à utiliser pour les réponses pertinentes...
    ne posez pas de problématique soi-disant simplifiée sur des problèmes que vous n'êtes pas capable de résoudre par respect pour ceux qui planchent dessus... sinon: et à utiliser pour insérer votre code...

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Voilà de quoi créer la table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE `Ordonnancements` (
    	`IDOrdonnancements` VARCHAR(36) NOT NULL,
    	`Minute` TINYINT(2) NOT NULL,
    	PRIMARY KEY (`IDOrdonnancements`),
    	INDEX `Minute` (`Minute`)
    )
    COLLATE='utf8_general_ci'
    ENGINE=MyISAM
    Chaque client possède son propre IDOrdonnancements unique.
    Si son IDOrdonnacements existe, je le supprime puis le recréé sous les conditions énoncées plus haut.

    Pour l'ajout, tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    INSERT INTO
    	Ordonnancements(IDOrdonnancements,Minute)
    VALUES
    	(UUID(),23);
    INSERT INTO
    	Ordonnancements(IDOrdonnancements,Minute)
    VALUES
    	(UUID(),59);
    INSERT INTO
    	Ordonnancements(IDOrdonnancements,Minute)
    VALUES
    	(UUID(),11);

    Création de la table des "Minutes" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CREATE TABLE `Entiers` (
    	`IDEntiers` INT(10) UNSIGNED NOT NULL,
    	PRIMARY KEY (`IDEntiers`)
    )
    COLLATE='utf8_general_ci'
    ENGINE=MyISAM;
    Remplissage de la table des minutes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    INSERT INTO
    	Entiers(IDEntiers)
    VALUES
    	(0),(1),(2),(3),(4),(5),(6),(7),(8),(9)
    Et pour un premier filtre de la 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
    17
    18
    19
    SELECT
    	M.Minute,
    	COUNT(O.Minute)
    FROM
    	(SELECT
    		D.IDEntiers*10+U.IDEntiers AS Minute
    	FROM
    		Entiers D,
    		Entiers U
    	WHERE
    		D.IDEntiers*10+U.IDEntiers<=59
    	) AS M
    	LEFT OUTER JOIN Ordonnancements O ON O.Minute=M.Minute
    GROUP BY
    	M.Minute
    HAVING
    	COUNT(O.Minute) < ALL (SELECT COUNT(Minute) FROM Ordonnancements GROUP BY Minute)
    ORDER BY
    	M.Minute
    Qui affiche toutes les minutes pour lesquelles l'occurrence est mini.
    Soit tous les chiffres de 0 à 59 hormis 11,23 et 59.
    Dernière modification par ok.Idriss ; 16/05/2012 à 13h05. Motif: SMS

  8. #8
    Invité
    Invité(e)
    Par défaut
    Re,

    En l'absence d'esprits pugnaces, je publie donc ma propre requête si ça peut servir à qq'un.
    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
    24
    25
    26
    27
    28
    29
    30
    SET @Val=40;
     
     
    SELECT
    	M.Minute,
    	COUNT(O.Minute),
    	-- CAST((@Val-M.Minute) AS SIGNED),
    	CASE
    		WHEN M.Minute>@Val THEN
    			M.Minute-@Val
    		ELSE
    			CAST((60-@Val+1+M.Minute) AS SIGNED)
    	END AS Diff
    FROM
    	(SELECT
    		D.IDEntiers*10+U.IDEntiers AS Minute
    	FROM
    		Entiers D,
    		Entiers U
    	WHERE
    		D.IDEntiers*10+U.IDEntiers<=59
    	) AS M
    	LEFT OUTER JOIN Ordonnancements O ON O.Minute=M.Minute
    GROUP BY
    	M.Minute
    HAVING
    	COUNT(O.Minute) < ALL (SELECT COUNT(Minute) FROM Ordonnancements GROUP BY Minute)
    ORDER BY
    	Diff ASC
    LIMIT 1
    Cette dernière me renvoie bien la "minute" pour laquelle le nombre d'occurrences est mini et délai entre @Val et minute est minimale
    Dernière modification par ok.Idriss ; 16/05/2012 à 13h06. Motif: SMS

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Requête INSERT conditionnelle
    Par dominos dans le forum Requêtes
    Réponses: 6
    Dernier message: 02/09/2014, 17h11
  2. Requête SQL conditionnelle
    Par Max25190 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 16/01/2014, 10h28
  3. Optimisation requête jointure "conditionnelle"
    Par BaBeuH dans le forum Adaptive Server Enterprise
    Réponses: 0
    Dernier message: 02/06/2010, 17h53
  4. [MySQL] Requête à résultats conditionnels
    Par tomaa dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 25/06/2008, 12h09
  5. Requête calculée conditionnelle
    Par BLazE dans le forum Access
    Réponses: 4
    Dernier message: 19/01/2007, 21h08

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