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 :

Récupérer le nombre d'associations ou 0 si n'existe pas


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Par défaut Récupérer le nombre d'associations ou 0 si n'existe pas
    Bonjour ,

    Je viens vous exposer un petit problème de compréhension sur un comptage d'association. Après des recherches sur le net, n'ayant probablement pas pu trouver les bons mots-clés, j'ai fait choux-blanc... j'ai trouvé des sujets, mais qui donnaient le même résultat que ce que j'avais essayé.

    J'ai une table licences et une table assoc_licencemaintenance :
    Nom : _licences.png
Affichages : 96
Taille : 14,4 Ko

    et la table assoc_licencemaintenance ne contient que trois champs : id(PK), id_licence(FK) et id_maintenance(FK).

    Voici leur contenu :
    Association :
    Nom : _assoc.png
Affichages : 98
Taille : 1,4 Ko
    Licence :
    Nom : _licences_content.png
Affichages : 109
Taille : 8,1 Ko

    J'aimerais faire une requête qui récupère tous les champs de ma table licences et le nombre d'id de ma table assoc_licencemaintenance avec un filtre qui ne récupère que les enregistrements dont id_contrat=x et etat=true.

    Pour aider à la compréhension voici la requête que j'ai pondue :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT li.*, count(ma.id) 
    FROM licences as li 
    JOIN assoc_licencemaintenance as ma 
    ON li.id=ma.id_licence 
    WHERE li.id_contrat='91' AND li.etat=true;

    Seulement, si mes licences actives avec le bon id_contrat ne possèdent pas de contrat de maintenance (aucune clé étrangère dans la table assoc_licencemaintenance ne possédant leur id) elles ne sont pas remontées dans le résultat de la requête (a cause de la clause ON) :
    Nom : _result.png
Affichages : 100
Taille : 5,5 Ko
    Cela devrait me remonter 3 résulats, avec 1 count(ma.id) à 2 et les autres à 0.

    J'aimerais comprendre, comment je pourrais faire pour remonter TOUTES les licences actives avec un id_contrat=x, et compter leur occurences d'id dans la clé étrangère id_licence de la table d'association assoc_licencemaintenance. (ou alors il faut que je fasse un trigger qui met un enregistrement bidon dans la table d'assoc à chaque création de licence, et que je count -1 ?)

    Merci beaucoup pour vos éclaircissements, j'avoue ne pas être coutumier avec MySQL (j'en suis resté aux CRUDs, aux jointures simples ... )

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    Utilisez une jointure externe

  3. #3
    Membre expérimenté Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Par défaut
    J'ai essayé avec un LEFT OUTER JOIN, j'ai l'impression que ca ne changeait rien ... faut-il modifier ma requête en plus ?

    EDIT :
    Si je remplace le count(ma.id) par ma.id, il me retourne NULL pour les licences dont les id ne sont pas référencés dans la tables d'assoc et sinon, l'id de l'association correspondante. Est-ce une bonne pratique de faire comme cela et de compter les même objets possédant, un id != NULL ?

    EDIT 2 :
    J'ai vu que l'opérateur count agrège les résultats, et c'est donc normal que ma requête me retourne qu'une ligne ... apparament un GROUP BY peut contrer ça mais je vois pas ... je vais devoir faire deux requêtes je le sens comme ca ...

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    Procédez en deux étapes :
    - faites une requête qui compte le nombre d’occurrence dans la table assoc_licencemaintenance par id_licence (count / group by)
    - faites une jointure externe entre votre table licence et la requête que vous venez de créer.

  5. #5
    Membre expérimenté Avatar de Vespiras
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2012
    Messages
    168
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2012
    Messages : 168
    Par défaut
    J'ai fait ceci :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT li.*, (SELECT count(id) FROM assoc_licencemaintenance GROUP BY id_licence) as nb_maintenance 
    FROM licence as li 
    WHERE li.id_contrat='x' AND li.etat=true;

    Mais MySQL me retourne l'erreur suivante : Subquery returns more than 1 row

    Du coup je me suis rapellé que vous m'aviez conseillé la jointure externe entre la table licence et celle crée par mon résultat de requête d'avant :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM licence as li 
    LEFT OUTER JOIN (SELECT count(id) FROM assoc_licencemaintenance as ma GROUP BY id_licence) 
    WHERE li.id_contrat='x' AND li.etat=true;

    Mais la j'ai l'erreur : Every derived table must have its own alias.
    J'ai essayé avec un as nb_ma derrière la requête imbriquée ... rien à faire. Pourriez vous m'indiquer ou je me trompe svp ?

    Merci beaucoup pour votre patience,

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Citation Envoyé par Vespiras Voir le message
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM licence as li 
    LEFT OUTER JOIN (SELECT id_licence, count(*) FROM assoc_licencemaintenance as ma GROUP BY id_licence) as tmp on tmp.id_licence = li.id_licence
    WHERE li.id_contrat='x' AND li.etat=true;

    il faudra peut etre enlever le AS, je ne me souvient plus de la syntaxe supportée par MySql

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/03/2006, 11h19
  2. [javascript/dom] Récupérer le nombre de lignes d'un tableau
    Par LE NEINDRE dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 17/02/2006, 11h51
  3. Récupérer le nombre de message dans sa boite GMAIL
    Par VERTYODA dans le forum Web & réseau
    Réponses: 4
    Dernier message: 28/11/2005, 19h25
  4. Réponses: 1
    Dernier message: 08/11/2005, 14h40
  5. récupérer un nombre aléatoire.
    Par loacast dans le forum C++
    Réponses: 3
    Dernier message: 18/10/2005, 12h37

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