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

Langage SQL Discussion :

Afficher un COUNT = 0


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 30
    Points : 18
    Points
    18
    Par défaut Afficher un COUNT = 0
    Hello !
    Voilà en fait je suis en plein exercice et j'ai plein de requêtes à faire, jusque là ça allait mais j'ai juste un petit problème.
    C'est une base de données qui gère une agence de location de voitures, et je voudrais récupérer les agences qui ne possèdent pas de voitures disponibles, donc j'ai fait une requête de ce genre-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT IFNULL(COUNT( a.num_agence ),0) AS nbVoitures, a.num_agence, e.nom
    FROM agence a
    LEFT JOIN employe e ON a.num_agence = e.num_agence_E
    LEFT JOIN vehicule v ON a.num_agence = v.num_agence_V
    WHERE e.type_employe LIKE  'Responsable'
    AND v.type_vehicule LIKE  'Voiture'
    GROUP BY a.num_agence_V
    HAVING COUNT(*)=0;
    Mais quand je teste la requête, on me retourne que la réponse est vide, ça fait quelques heures que je bloque je ne comprends pas trop, si quelqu'un a une idée... O.O

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    Je vois deux problèmes dans ta requête
    a/le fait que ta requête soit vide
    b/le fait que tu compte les agences et pas les voitures pour afficher nbVoitures.
    c/Je ne vois pas le critère voiture disponible.
    Pour le point a/
    Tu as bien penser à utiliser le left outer join pour avoir toutes les agences y compris celle qui n'ont pas de voiture mais après tu ruines tout en mettant dans le where
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND v.type_vehicule LIKE  'Voiture'
    Cette condition il faut la mettre dans le on de la jointure.

    D'autres part une fois que tu auras fait cela , je dirais que ton count(*)=0 ne renverras rien car tu auras des lignes. Il faudrait compter les voitures.
    Donc cela donnerait en prenant comme hypothèse que num_vehicule est la clef de la table vehicule .
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT IFNULL(COUNT( a.num_agence ),0) AS nbVoitures, a.num_agence, e.nom
    FROM agence a
    LEFT JOIN employe e ON a.num_agence = e.num_agence_E
    LEFT JOIN vehicule v ON a.num_agence = v.num_agence_V
    AND v.type_vehicule LIKE  'Voiture'
    WHERE e.type_employe LIKE  'Responsable'
    GROUP BY a.num_agence_V,e.nom
    HAVING COUNT(distinct v.num_vehicule)=0;
    [edit]la requête précédente ne fonctionnera pas, pour la même raison qu'avec un count(*). Il faudrait faire une sous requête avec le count(*) mais je n'ai pas le temps de l'écrire il faut que je parte travailler[/edit]
    Une autre façon d'ecrire cela c'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT  a.num_agence, e.nom
    FROM agence a
    LEFT JOIN employe e ON a.num_agence = e.num_agence_E
    LEFT JOIN vehicule v ON a.num_agence = v.num_agence_V
    AND v.type_vehicule LIKE  'Voiture'
    WHERE e.type_employe LIKE  'Responsable'
    and vv.num_agence_V is null
    ou encore en utilisant un not exist
    Concernant le point c / à savoir le critère voiture disponible. J'ai l'impression que toi ce que tu cherches c'est les agences qui n'ont pas de voiture, qu'elle soient disponible ou pas, mais comme on n'a pas le modèle de données , je ne peux pas t'en dire plus.

    Soazig

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Et voilà la requête avec count à laquelle je pensais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT  a.num_agence, e.nom
    FROM agence a
    LEFT JOIN employe e ON a.num_agence = e.num_agence_E
     
    LEFT JOIN 
    (select v.num_agence_V, count(*) as nbre_voiture
    from vehicule  v
    where v.type_vehicule LIKE  'Voiture'
    group by v.num_agence_V) as V1
    on a.num_agence=v1.num_agence_V
    WHERE e.type_employe LIKE  'Responsable'
    and coalesce(nbre_voiture,0)=0;
    A priori on devrait pouvoir remplacer coalesce(nbre_voiture,0)=0 par nbre_voiture is null.
    a+
    Soazig

  4. #4
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2012
    Messages : 30
    Points : 18
    Points
    18
    Par défaut
    Oh mon dieu merci !

    1) En fait je viens de commencer le langage, je pense avoir mal compris l'utilisation du left join je ne pensais pas pouvoir mettre deux conditions sur le ON.

    2)Veux-tu dire que, même si a.num_agence = v.num_agence_V je suis quand même censé retourner v.num_agence_V ?

    J'ai testé les deux requêtes, il faut remplacer coalesce(nbre_voiture)=0 par nbre_voiture is null sinon ça ne marche pas, mais sinon les deux requêtes marchent !

    Plus le fait que l'exercice soit fini j'essaie plutôt de le comprendre, tu as effectué un LEFT JOIN de agence vers employe pour récupérer les employés avec la bonne clé, et on utilise la clause where pour récupérer les responsables,
    Ensuite un LEFT JOIN de agence vers vehicule pour récupérer les numéros d'immatriculation des véhicules de type voiture, et le compte par rapport aux numéros d'agences auxquels ils ont été attributés, puis dans la clause where on récupère seulement les types voitures,
    Puis on prend les COUNT = 0 ?

    Concernant le premier code que tu m'as donné, il marche, il me donne bien les agences qui n'ont pas de voiture, donc je crois qu'il n'y a pas de problème non ?

    Je te remercie beaucoup en tout cas !

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    956
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 956
    Points : 1 199
    Points
    1 199
    Par défaut
    Bonjour,
    1/Si il peut y avoir plusieurs conditions sur le on et quand on fait une jointure externe, il faut mettre toutes les conditions sur la table dont les données sont optionnelles sur le on, sinon on se retrouve avec une jointure interne.
    2)Veux-tu dire que, même si a.num_agence = v.num_agence_V je suis quand même censé retourner v.num_agence_V ?
    Je ne comprends pas la question? Ton select renvoie ce dont tu as besoin.

    tu as effectué un LEFT JOIN de agence vers employe pour récupérer les employés avec la bonne clé, et on utilise la clause where pour récupérer les responsables,
    ça c'est toi qui l'a fait, c'était dans ta première requête et je n'ai pas touché cette partie là. Mais comme il ya dans le where
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE e.type_employe LIKE  'Responsable'
    Le fait que c'est un left outer join ne sert à rien, tu n'auras pas les agences sans employé.
    Et à y regarder de plus prés comme tu n'as pas de caractère joker dans ton Like tu pourrais utiliser un égal.
    Ce qui en combinant les deux remarques donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  a.num_agence, e.nom
    FROM agence a
    INNER JOIN employe e 
    	ON a.num_agence = e.num_agence_E
    LEFT JOIN vehicule v 
    	ON a.num_agence = v.num_agence_V
    	AND v.type_vehicule =  'Voiture'
    WHERE e.type_employe =  'Responsable'
    AND vv.num_agence_V IS NULL
    J'espère que c'est plus clair.
    Soazig

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

Discussions similaires

  1. [MySQL] Afficher fonction count
    Par afibase dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 27/01/2014, 18h28
  2. COUNT() elle compte mais n affiche pas
    Par tyberium dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/09/2006, 23h09
  3. Afficher le résultat d'un COUNT même null
    Par trangsene dans le forum Langage SQL
    Réponses: 10
    Dernier message: 18/11/2005, 18h07
  4. [MySQL] Requete count et l'afficher
    Par tyarak dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 05/11/2005, 21h57
  5. Afficher les enregistrements si le count() vaut 0
    Par j14z dans le forum Requêtes
    Réponses: 7
    Dernier message: 06/04/2004, 09h51

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