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 :

Select - jointure- count


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut Select - jointure- count
    Bonjour.
    Encore une bonne année a tous.
    J'ai deux tables
    la première contient des dates de cours:
    idcours-date-nbrdeplace
    1 - 2010-01-10 - 10

    la deuxième des participants:
    idparticipant - idcours -nom
    1- 1 - bibi
    2-1- juju

    je chercher a faire une requette pour récupérer les dates ou le nb de place est inférieur au nombre de participants
    je n'arrive pas a trouver comment faire cette condition

    pour l'instant j'ai teste des choses de ce genre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select tabdate.idcours
    from tabcours 
    left join tabarticipant on tabcours.idcours=tabparticipant.idcours
    having count(tabparticipant) < tabcours.Nbrdeplace
    je sais bien que mon count est mauvais
    mais la je bloque
    doit falloir des imbriquation de sélect mais la je cale

    Si vous pouviez me donner un coup de main ( a défaut d' un coup de pieds u c.... :-) )

    si par exemple je veux ajouter des conditions comme selection entre 2 date
    where ce mets avant le having et ne gêne en rien?

    Merci pour votre aide et conseil

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    Il te manque la clause de regroupement (GROUP BY). Essaie plutôt comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT p.idcours
    FROM tabcours AS c
    LEFT JOIN tabarticipant AS p ON c.idcours = p.idcours
    GROUP BY p.idcours
    HAVING count(*) < c.Nbrdeplace
    Avec les alias, la requête est plus facile à lire.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut
    merci pour ta réponse,
    effectivement c'est déja mieux mais par contre la ca ne selectionne que les dates ou y'a deja des inscrits au cours
    si par exemple pour un cours y'a pas d'inscrit du coup je l'ai pas.
    Je vais deja refaire des tests avec la piste du group by


  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut
    un truc bizarre
    je fais cette requete j'ai une erreur,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT c.id_date 
    FROM cours_date AS c 
      JOIN cours_participant as p ON c.id_date=p.id_date 
    GROUP BY p.id_date 
     HAVING count(*) < c.nbr_place
    je fais ca, pas d'erreur ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * 
    FROM cours_date AS c 
      JOIN cours_participant as p ON c.id_date=p.id_date 
    GROUP BY p.id_date 
     HAVING count(*) < c.nbr_place
    pour l'erreur il me dis champs inconnu dans la condition having ?

    mais j'ai du mal sortir toute les dates sans réservation et avec moins de participants que le nbr max de participant
    grrrrrr

  5. #5
    Membre actif
    Inscrit en
    Novembre 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Âge : 60

    Informations forums :
    Inscription : Novembre 2009
    Messages : 24
    Par défaut
    De base :

    Si tu utilise un GROUP BY, c’est que ta SELECT contient des champs de trois types.
    - Des constantes, ‘TOTO’
    - Ceux qui servent de clef de regroupement, table.colonne
    - Ceux sur lesquels on opère l’opération d’agrégation, SUM(table.colonne)

    Si tu as :
    SELECT A , B , C , Sum(D) , Avg(E), Count(*) , ‘TOTO’
    Tu devras forcement avoir :
    GROUP BY A , B , C (toto on s’en fou c’est une constante)

    Pour le reste, il suffit de considérer que la clause HAVING est l’équivalent pour le GROUP BY de la clause WHERE pour le SELECT.

    SELECT
    FROM
    WHERE
    GROUP BY
    HAVING

    Dans l’ordre.

    Le HAVING ne peut filtrer QUE sur les champs de la SELECT.
    Dans ton exemple, ni count(*) ni c.nbr_place ne sont dans la SELECT … donc …

    Ton raisonnement n’est pas clair :

    Citation Envoyé par tonin10 Voir le message
    je chercher a faire une requette pour récupérer les dates ou le nb de place est inférieur au nombre de participants
    Citation Envoyé par tonin10 Voir le message
    ...mais par contre la ca ne selectionne que les dates ou y'a deja des inscrits au cours
    si par exemple pour un cours y'a pas d'inscrit du coup je l'ai pas.
    Si il n’y a pas de participants, leur nombre ne peut pas être supérieur au nombre de place …

    Quelle est ton besoin exactement :p ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 88
    Par défaut
    merci pour toutes ces explications,

    en fait je veux toutes les dates avec des places libres(id date nbr de place restantes pour cette date).
    pour ca j'ai besoin pour chaque date (table cours_date) de compter le nombre de place utilisée ( table cours_participant) et de voir si c'est < au nombre de place (mis dans la table cours_date champs nbr_place)
    voici les tables exa peut etre plus clair que mon texte :
    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
    31
    32
    33
    34
    35
    36
    37
    38
    39
    CREATE TABLE IF NOT EXISTS `cours_date` (
      `id_date` int(10) unsigned NOT NULL auto_increment,
      `date` date NOT NULL default '0000-00-00',
      `heure` time NOT NULL default '00:00:00',
      `nbr_place` int(10) unsigned NOT NULL default '0',
      PRIMARY KEY  (`id_date`)
    ) TYPE=MyISAM AUTO_INCREMENT=6 ;
     
    --
    -- Contenu de la table `cours_date`
    --
     
    INSERT INTO `cours_date` (`id_date`, `date`, `heure`, `nbr_place`) VALUES
    (1, '2010-01-05', '18:00:00', 10),
    (2, '2010-01-06', '18:00:00', 10),
    (3, '2010-01-07', '18:00:00', 10),
    (4, '2010-01-08', '18:00:00', 10),
    (5, '2010-01-05', '10:00:00', 10);
     
     
    CREATE TABLE IF NOT EXISTS `cours_participant` (
      `id_participant` int(10) unsigned NOT NULL auto_increment,
      `id_reservation` int(10) unsigned NOT NULL default '0',
      `nom` varchar(255) NOT NULL default '',
      `prenom` varchar(255) NOT NULL default '',
      `email` varchar(255) NOT NULL default '',
      `tel` varchar(255) NOT NULL default '',
      `id_date` int(10) unsigned NOT NULL default '0',
      `date` datetime NOT NULL default '0000-00-00 00:00:00',
      PRIMARY KEY  (`id_participant`)
    ) TYPE=MyISAM AUTO_INCREMENT=3 ;
     
    --
    -- Contenu de la table `cours_participant`
    --
     
    INSERT INTO `cours_participant` (`id_participant`, `id_reservation`, `nom`, `prenom`, `email`, `tel`, `id_date`, `date`) VALUES
    (1, 1, 'antonin1', '', '', '', 1, '2010-01-05 10:00:00'),
    (2, 1, 'antonin2', '', '', '', 1, '2010-01-05 00:00:00');
    cette requete ne fonctionne pas mais faut bien essayer pour comprendre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM cours_date  as c
    WHERE  
    (SELECT count(*) from cours_participant as p,cours date as ca where p.id_date=ca.id_date group by p.id_date ) < c.nbr_place
    encore merci pour vos aides

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

Discussions similaires

  1. [SQL] SELECT jointure 7 Tables
    Par php4life dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 29/01/2007, 09h38
  2. Select 2 COUNT BETWEEN 2 Date
    Par aliwassem dans le forum Langage SQL
    Réponses: 34
    Dernier message: 26/01/2007, 00h17
  3. [MySQL] SELECT données + COUNT
    Par Girzi dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 29/06/2006, 11h57
  4. Update, select et count
    Par dbuweb dans le forum Requêtes
    Réponses: 2
    Dernier message: 21/06/2006, 16h11
  5. [débutant] Jointure + Count
    Par Yann21 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 28/10/2003, 13h52

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