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 :

Sous requête pour choix multiples


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 23
    Points
    23
    Par défaut Sous requête pour choix multiples
    Salut à tous,

    Le titre étant compliqué à trouver pour mon problème, je vous l'expose ici :

    Je dispose de deux tables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    CREATE TABLE IF NOT EXISTS `t_conference_co` (
      `CO_id` int(11) NOT NULL,
      `CO_libelle` tinytext CHARACTER SET latin1 NOT NULL,
      `CO_module` int(11) NOT NULL,
      `CO_date` varchar(45) CHARACTER SET latin1 NOT NULL,
      `CO_heure_debut` varchar(45) CHARACTER SET latin1 NOT NULL,
      `CO_heure_fin` varchar(45) CHARACTER SET latin1 NOT NULL,
      `CO_conferencier` int(11) NOT NULL,
      `CO_max_place` int(11) NOT NULL,
      PRIMARY KEY (`CO_id`),
      KEY `CO_conferencier` (`CO_conferencier`),
      KEY `CO_module` (`CO_module`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_bin;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
      `CH_id` int(11) NOT NULL AUTO_INCREMENT,
      `CH_id_ut` int(11) NOT NULL,
      `CH_conf1` int(11) NOT NULL,
      `CH_conf2` int(11) NOT NULL,
      `CH_conf3` int(11) NOT NULL,
      `CH_date_choix` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`CH_id`),
      KEY `CH_id_ut` (`CH_id_ut`),
      KEY `CH_conf1` (`CH_conf1`),
      KEY `CH_conf2` (`CH_conf2`),
      KEY `CH_conf3` (`CH_conf3`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
    - La première matérialise des conférences, la seconde concerne les choix effectués par les utilisateurs. Ainsi chaque clé de la seconde (CH_conf1,2 et 3) est liée à une conférence.

    Le hic c'est que je souhaiterai connaitre le nombre de places restantes par conférence, et ça là que ça coince.

    Je parviens à connaitre le nombre de places pour la conférence 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CO_max_place - COUNT(CH_id_ut)
    FROM tj_choix_ch
    INNER JOIN T_conference_CO
    ON CH_conf1 = CO_id
    where CH_conf1 = 1
    Mais je souhaiterai savoir s'il est possible d'obtenir un tableau avec toutes les informations, ou si je suis obligé de boucler sur une requête avec un script php

    J'ai aussi pensé à des triggers de mise à jour qui décrémenterai le nombre de place par conférence, lors d'une insertion dans la deuxième table, mais je ne préfère pas m'y pencher pour le moment...

    Merci d'avance pour les réponses/pistes apportées à mon problème
    Koven

  2. #2
    Membre habitué Avatar de Joel Pinto Ribeiro
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 95
    Points : 145
    Points
    145
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT CO_max_place , COUNT(CH_id_ut)
    FROM tj_choix_ch
    INNER JOIN T_conference_CO 
    ON CH_conf1 = CO_id
    group by CH_conf1
    En faisant un regroupement? (tu peut faire un union avec ch_conf2 et ch_conf3 pour avoir le tout)
    Jeune ingénieur passionné des technologies Microsoft .NET, ainsi que du partage de connaissances.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    105
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 105
    Points : 57
    Points
    57
    Par défaut
    Moi je n'aurais pas organisé la table des choix comme ca.
    mais plutot comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
     `CH_id` int(11) NOT NULL AUTO_INCREMENT,
      `CH_id_ut` int(11) NOT NULL,
      `CH_conf` int(11) NOT NULL,
     
      `CH_date_choix` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (`CH_id`),
      KEY `CH_id_ut` (`CH_id_ut`),
      KEY `CH_conf` (`CH_conf`),
     
    ) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
    Ainsi pour chaque utilisateur tu peux avoir 3 lignes dans la table une par conférence choisie.
    L'avantage c'est que tu peux compter bcp plus simplement et si demain tu veux proposer 4 choix de conférences a tes utilisateurs, tu n'auras aucun nouveau dev a faire juste a régler applicativement le nb max de conférences autorisées par utilisateur.
    Penses également à gérer tes contraintes d'intégrité entre les deux tables.

    Ca ne repond sans doute pas exactement a ta question mais c'est sans doute une piste à explorer.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur C++
    Inscrit en
    Avril 2012
    Messages
    771
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur C++
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2012
    Messages : 771
    Points : 1 631
    Points
    1 631
    Par défaut
    Bonsoir,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT c.CO_libelle, (c.CO_max_place - ( IFNULL(ch1.placeReserv, 0) + IFNULL(ch2.placeReserv,0) + IFNULL(ch3.placeReserv,0) ) ) AS placeRestantes 
    FROM t_conference_co c
    LEFT JOIN ( SELECT CH_conf1, COUNT(CH_conf1) AS placeReserv FROM t_utilisateur_co group by CH_conf1 ) ch1 ON c.CO_id = ch1.CH_conf1
    LEFT JOIN ( SELECT CH_conf2, COUNT(CH_conf2) AS placeReserv FROM t_utilisateur_co group by CH_conf2 ) ch2 ON c.CO_id = ch2.CH_conf2
    LEFT JOIN ( SELECT CH_conf3, COUNT(CH_conf3) AS placeReserv FROM t_utilisateur_co group by CH_conf3 ) ch3 ON c.CO_id = ch3.CH_conf3
    GROUP BY c.CO_id;
    je pense que sa doit donner le résultat que tu recherche ^^
    une réponse vous a permis d'avancer ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 28
    Points : 23
    Points
    23
    Par défaut
    Salut à tous !

    Je tiens tout d'abord à vous remercier pour les solutions proposées, j'ai finalement décidé de revoir la construction de mes tables selon le modèle de boubil, ce qui me permettra par la suite d'augmenter le nombre de conférences à choisir.

    Cependant, je remercie aussi Exia93 car ça requête fonctionne parfaitement (il faut juste changer le t_utilisateur_co par tj_choix_ch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT c.CO_ID,c.CO_libelle, (c.CO_max_place - ( IFNULL(ch1.placeReserv, 0) + IFNULL(ch2.placeReserv,0) + IFNULL(ch3.placeReserv,0) ) ) AS placeRestantes 
    FROM t_conference_co c
    LEFT JOIN ( SELECT CH_conf1, COUNT(CH_conf1) AS placeReserv FROM tj_choix_ch GROUP BY CH_conf1 ) ch1 ON c.CO_id = ch1.CH_conf1
    LEFT JOIN ( SELECT CH_conf2, COUNT(CH_conf2) AS placeReserv FROM tj_choix_ch GROUP BY CH_conf2 ) ch2 ON c.CO_id = ch2.CH_conf2
    LEFT JOIN ( SELECT CH_conf3, COUNT(CH_conf3) AS placeReserv FROM tj_choix_ch GROUP BY CH_conf3 ) ch3 ON c.CO_id = ch3.CH_conf3
    GROUP BY c.CO_id
    Je marque le sujet en résolu, merci à tous encore

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

Discussions similaires

  1. Groupements et sous requête pour les Boss
    Par aerosky dans le forum Langage SQL
    Réponses: 3
    Dernier message: 19/09/2013, 12h09
  2. intervalle pour choix multiple
    Par paskal++ dans le forum Débuter
    Réponses: 9
    Dernier message: 15/10/2010, 17h38
  3. Sous requête pour sélectionner certaines colonnes
    Par Vince57 dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/08/2010, 11h31
  4. un SUM + sous-requête pour remplacer une boucle itérative
    Par forzaxelah dans le forum Langage SQL
    Réponses: 2
    Dernier message: 29/03/2009, 22h16
  5. Pb de sous-requête pour une mise à jour
    Par Balthos dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 05/03/2008, 09h13

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