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 sur 2 tables


Sujet :

Requêtes MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut Requête sur 2 tables
    Bonjour,

    Ordinairement je n'ai pas de problème pour lancer des requêtes sur deux tables avec un nom de colonne commun aux deux tables, mais cette fois ci je n'y arrive pas.

    Dans la Table1 j''ai une colonne NumBadge (correspondant à un badge) et une colonne "Nom" . NumBadge est la "primary key" de cette table.
    Dans table2 j'ai une colonne " NumBadge et une colonne "Article" Ainsi plusieurs lignes peuvent avoir la même valeur de NumBadge pour des articles différents.

    Ce que je souhaite c'est obtenir le nombre d'articles liés à la valeur de chaque Badge, mais également le nom du titulaire de ce badge.

    Pour ce faire j'émets la requête suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT  b.count(article) Nombre, a.NumBadge, a.Nom  FROM  table1 a, table2 b where a.NmBadge=b.NumBadge
    Cette commande ne me donne pas d'erreur mais retourne aucune ligne.

    Dois-je utiliser des selects imbriqués ou une clause JOIN ? Si oui comment dois-je coder la requête.

    Merci d'avance pour tout conseil.

    Gégé

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut GérardMartinelli.

    Citation Envoyé par GérardMartinelli
    Dans la Table1 j''ai une colonne NumBadge (correspondant à un badge) et une colonne "Nom" . NumBadge est la "primary key" de cette table.
    Dans table2 j'ai une colonne " NumBadge et une colonne "Article" Ainsi plusieurs lignes peuvent avoir la même valeur de NumBadge pour des articles différents.
    La table2 contient une clef étrangère (NumBadge) qui va pointer sur la table1.

    Citation Envoyé par GérardMartinelli
    Ce que je souhaite c'est obtenir le nombre d'articles liés à la valeur de chaque Badge, mais également le nom du titulaire de ce badge.
    Quand on ne sait pas, on lit la documentation officielle MySql concernant la syntaxe de la jointure :
    --> https://dev.mysql.com/doc/refman/8.0/en/join.html
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    select           t1.NumBadge,
                     t1.nom,
                     count(t2.article) as nbArticle
     
               from  table1 as t1
     
    left outer join  table2 as t2
                 on  t2.NumBadge = t1.NumBadge
     
           group by t1.NumBadge, t1.nom;
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Merci Atemus24 pour cette réponse détaillée. Comme je l'avais précédemment écrit, je me demandais s'il fallait utiliser JOIN, j'avais lu la documentation, mais je dois avouer que je n'avais pas tout compris (surtout en Anglais).
    Je vais faire des essais en m'appuyant sur ton exemple.

    Merci encore

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Boujour,

    Suite à ta réponse artémus24, j'ai ai fait de nombreux essais qui se sont montrés infructueux. Lorsque j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     select          t1.numBadge,
                     t1.identifiant,
                     count(t2.articles) as nbArticles
               from  Badges  as t1
     
    left outer join  Journal as t2
                 on  t2.numBadge = t1.numBadge
     
           group by t1.numBadge, t1.identifiant;
    La colonne nbArticles me renvoie toujours 0. Ce qui évidemment n'est pas exact.

    J'ai également essayé avec des Select Imbriqués :

    Dans un premier temps j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select numBadge, count(article) as nb from  journal group by  numBadge
    Le retour de cette requête est bien conforme à mes espérances

    Maintenant si je veux ajouter l'identifiant (le nom) de la table "Badges" je fait ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Select t1.numBadge, t1.identifiant,  t2. nbArticles from  badges as t1, (Select numBadge, count(article) as nbArticles from  journal group by  numBadge) as t2  where t1.numBadge=t2.numBadge
    Cette fois je n'obtiens aucune ligne en retour.

    Dans ces requêtes que j'ai lancées je dois faire certainement une erreur (ou plusieurs) quelque part, mais je ne vois pas. Bien sûr, je peux par programmation m'en tirer en faisant des selects séparés, mais j'aurais tant voulu (ne serait-ce que pour apprendre) utiliser soit la clause JOIN soit des select imbriqués.

    Désolé d'être si mauvais. Merci d'avance.

    Gégé

  5. #5
    Rédacteur/Modérateur

    Homme Profil pro
    Ingénieur qualité méthodes
    Inscrit en
    Décembre 2013
    Messages
    4 054
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur qualité méthodes
    Secteur : Conseil

    Informations forums :
    Inscription : Décembre 2013
    Messages : 4 054
    Points : 9 394
    Points
    9 394
    Par défaut
    Normalement, la requête initiale est bonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select t1.numBadge,
    t1.identifiant,
    count(t2.articles) as nbArticles
    from Badges as t1
    left outer join Journal as t2
    on t2.numBadge = t1.numBadge
    group by t1.numBadge, t1.identifiant;
    Pour comprendre ce qui ne va pas, il faut décomposer.
    Essaie cette requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select t1.numBadge,
    t1.identifiant,
    t2.articles
    from Badges as t1
    left outer join Journal as t2
    on t2.numBadge = t1.numBadge
    Ca va afficher le détail (et pas les totaux). Mais, ici, tu auras des lignes avec 'NULL' dans la colonne articles. A toi de vérifier, mais apparemment, il n'y a aucune valeur numBadge commune entre les 2 tables.
    N'oubliez pas le bouton Résolu si vous avez obtenu une réponse à votre question.

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 381
    Points : 19 065
    Points
    19 065
    Par défaut
    Salut GérardMartinelli.

    Il est fort possible que la colonne t2.article vous retourne des valeurs à NULL.
    Dans ce cas là, il faut transformer le NULL en zéro.

    Vous remplacez la ligne suivante dans la requête que je vous ai communiqué :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(t2.articles) as nbArticles
    par cet ajout :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(coalesce(t2.article, 0)) as nbArticles
    --> https://dev.mysql.com/doc/refman/8.0...ction_coalesce

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 265
    Points : 149
    Points
    149
    Par défaut
    Merci à vous deux pour répondre le dimanche j'apprécie vraiment votre aide.

    Comme vous pensiez tous les deux que cette requête devait marcher j'ai investigué sur le contenu des tables et j'ai trouvé enfin pourquoi cela ne marchait pas. Comme disent les Anglo-saxons "user error".
    Dans la table journal, toutes les valeurs de badges ( alphabétique donc définies en Varchar) commencent par un espace (une erreur au moment du chargement) . Alors que ce n'est pas le cas dans la table badge.

    J'ai donc rechargé la table journal en corrigeant ceci et cela marche de façon impeccable aussi bien avec JOIN qu'avec des Selects imbriqués (qui évidemment donnent le même résultat).

    Quoiqu'il en soit, malgré cette erreur, vous m'avez permis de composer cette requête un peu complexe ce qui était l'objectif.

    Merci encore pour votre aide.

    Gégé

  8. #8
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 198
    Points : 12 774
    Points
    12 774
    Par défaut
    Citation Envoyé par GérardMartinelli Voir le message
    Comme vous pensiez tous les deux que cette requête devait marcher j'ai investigué sur le contenu des tables et j'ai trouvé enfin pourquoi cela ne marchait pas. Comme disent les Anglo-saxons "user error".
    Dans la table journal, toutes les valeurs de badges ( alphabétique donc définies en Varchar) commencent par un espace (une erreur au moment du chargement) . Alors que ce n'est pas le cas dans la table badge.
    D'où les contraintes d'intégrité référentielle... Une telle erreur n'aurait tout simplement pas été possible.

    Tatayo.

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

Discussions similaires

  1. besoin d'aide -> requete sur 2 tables avec count()
    Par parksto dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/10/2005, 19h06
  2. requete sur 2 tables mysql
    Par PAYASS59 dans le forum Requêtes
    Réponses: 3
    Dernier message: 19/09/2005, 11h48
  3. Pb requete sur 2 tables
    Par panini182 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 09/08/2005, 17h26
  4. Requete sur deux tables
    Par ReaseT dans le forum ASP
    Réponses: 13
    Dernier message: 07/02/2005, 16h18
  5. [MS-SQL]requete sur 3 tables
    Par pascalT dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 30/04/2003, 11h24

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