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 :

Où est mon erreur de jointure ?


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 115
    Par défaut Où est mon erreur de jointure ?
    Hello tous,
    un truc me chagrine

    voilà 2 tables :
    Code sql : 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
     
    `p_rating_types` (`id`, `nom_type`, `value_type`, `static`, `statut`, `ordre`) VALUES
    (3, 'Bugs', '', 0, 1, 3),
    (7, 'Complet', '', 0, 1, 7),
    (2, 'Esthétique', '', 0, 1, 2),
    (1, 'Informatif', '', 0, 1, 1),
    (6, 'Intérêt', '', 0, 1, 6),
    (4, 'Originalité', '', 0, 1, 4),
     
    et 
     
    `p_rate_types_list` (`id_list`, `id_type`, `active`) VALUES
    (2, 1, 1),
    (2, 2, 0),
    (2, 3, 0),
    (2, 4, 1),
    (2, 5, 0),
    (2, 6, 0),
    (3, 1, 1),
    (3, 2, 0),
    (3, 3, 0),
    (3, 4, 0),
    (3, 5, 0),
    (3, 6, 1),
    (4, 1, 0),
    (4, 2, 1),
    (4, 3, 1),

    ma 1ere requète, me renvoie seulement les id et nom_type dont les id_type sont présents dans la 2eme table, avec la bonne valeur de active.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT rt.id as idType, rt.nom_type as nomType, rtl.active as active 
    FROM p_rating_types rt 
    INNER JOIN p_rate_types_list rtl ON (rtl.id_list) 
    WHERE rt.id = rtl.id_type 
    GROUP BY rt.id 
    ORDER BY rt.id ASC
    la 2Eme me renvoie tous les id, et nom types présents dans la table 1 ()
    mais la valeur de active ressort tout à 1 , donc faux.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT rt.id as idType, rt.nom_type as nomType, rtl.active as active 
    FROM p_rating_types rt 
    INNER JOIN p_rate_types_list rtl ON (rtl.id_list) 
    WHERE rt.statut=1
    GROUP BY rt.id 
    ORDER BY rt.id ASC
    alors j'aurai besoin d'un mix des deux. rires.
    à savoir tous les id et nom_type de table 1 mais avec les bonnes valeurs de table 2 !

    j'ai tenté en changeant la jointure sans succès pour le moment !
    je ne dois pas être loin, mais je ne vois pas

    une idée ?

    merci

  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
    1) Toutes les colonnes du SELECT ne figurant pas dans une fonction de groupage doivent figurer dans le GROUP BY sous peine de récupérer pour les colonnes absentes des résultats aléatoires.

    Comme tu n'a pas de fonction de groupage dans tes requêtes, le GROUP BY n'y a pas de sens !

    2) Il manque la moitié de tes conditions de +. C'est comme si tu répondais "oui" à une question commençant par "comment" !
    Autrement dit, ta condition de jointure est toujours vraie et ça revient à faire un produit cartésien des deux tables.

    La première erreur me laisse à penser que tu utilises le mauvais MySQL et j'ai l'impression que, comme pour la première erreur, la seconde aurait entraîné un refus de la requête par tout autre SGBD.

    En fait, je vois que tu as fait un mix avec la vielle syntaxe de jointure obsolète depuis 20 ans car ta condition de jointure est dans le WHERE !

    Cette requête devrait mieux répondre à ton besoin je pense (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT rt.id AS idType, 
    	rt.nom_type AS nomType, 
    	rtl.active AS active 
    FROM p_rating_types rt 
    INNER JOIN p_rate_types_list rtl ON rt.id = rtl.id_type 
    ORDER BY rt.id ASC
    Elle est en tout cas syntaxiquement plus juste.
    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é
    Inscrit en
    Juillet 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 115
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    1) Toutes les colonnes du SELECT ne figurant pas dans une fonction de groupage doivent figurer dans le GROUP BY sous peine de récupérer pour les colonnes absentes des résultats aléatoires.

    Comme tu n'a pas de fonction de groupage dans tes requêtes, le GROUP BY n'y a pas de sens !

    2) Il manque la moitié de tes conditions de +. C'est comme si tu répondais "oui" à une question commençant par "comment" !
    Autrement dit, ta condition de jointure est toujours vraie et ça revient à faire un produit cartésien des deux tables.

    La première erreur me laisse à penser que tu utilises le mauvais MySQL et j'ai l'impression que, comme pour la première erreur, la seconde aurait entraîné un refus de la requête par tout autre SGBD.

    En fait, je vois que tu as fait un mix avec la vielle syntaxe de jointure obsolète depuis 20 ans car ta condition de jointure est dans le WHERE !

    Cette requête devrait mieux répondre à ton besoin je pense (pas testé) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT rt.id AS idType, 
    	rt.nom_type AS nomType, 
    	rtl.active AS active 
    FROM p_rating_types rt 
    INNER JOIN p_rate_types_list rtl ON rt.id = rtl.id_type 
    ORDER BY rt.id ASC
    Elle est en tout cas syntaxiquement plus juste.
    hello CinePhil

    rires 20 ans ! j'ai mis la clause dans le where car ce n'est pas sur cette égalité que souhaite avoir la jointure. et j'avais au préalable mis le ON comme tu me le suggère, mais mes résultats étaient limités justement comme la 1ere requete erreur

    ta requete me renvoi tous les résultats de types en 4 exemplaires ,avec 1 seul coché là où il doit être coché !

    si j'ajoute un GROU BY rt.id, je n'ai plus de résultats, c'est ce que tu as expliqué sur les group me semble, mais pourtant il est dans le champ du select
    [edit]
    si je groupe comme :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT rt.id AS idType, rt.nom_type AS nomType, rtl.active AS active FROM p_rating_types rt INNER JOIN p_rate_types_list rtl ON rt.id = rtl.id_type WHERE statut=1 GROUP BY rt.nom_type ORDER BY rt.id ASC
    j'ai les memes résultats que ma 1ere fausse requete, cad qu'il manque un nomType possible.
    [/edit]

    une idée ?

    je te remecie

  4. #4
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 999
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 999
    Billets dans le blog
    6
    Par défaut
    Encore une fois, et comme déjà indiqué par Cinephil :
    LE GROUP BY NE SERT A RIEN DANS VOTRE REQUÊTE !
    est-ce clair ?

    La clause GROUP BY sert à regrouper des lignes ayant des caractéristiques communes afin que les fonction d'agrégation (SUM, COUNT, MAX...) puissent agir de manière relative aux sous ensembles ainsi définis.

    Certains imbéciles qui ne prennent pas le temps d'apprendre le langage SQL pensent naïvement que GROUP BY fait un tri ou un dédoublonnage. Il n'en est rien.

    Commencez par apprendre le langage SQL. Mon livre, comme mon site web peuvent vos y aider !

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  5. #5
    Membre confirmé
    Inscrit en
    Juillet 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 115
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Encore une fois, et comme déjà indiqué par Cinephil :
    LE GROUP BY NE SERT A RIEN DANS VOTRE REQUÊTE !
    est-ce clair ?
    La clause GROUP BY sert à regrouper des lignes ayant des caractéristiques communes afin que les fonction d'agrégation (SUM, COUNT, MAX...) puissent agir de manière relative aux sous ensembles ainsi définis.
    comme ca oui c'est bcp plus clair. mais je pensais que je devais reformuler la requete pour que le group by soit pris en compte, et non que ce n'était pas possible .
    Certains imbéciles qui ne prennent pas le temps d'apprendre le langage SQL pensent naïvement que GROUP BY fait un tri ou un dédoublonnage. Il n'en est rien.

    Commencez par apprendre le langage SQL. Mon livre, comme mon site web peuvent vos y aider !
    A +
    quand au jugement , je trouve que vous y allez un peu fort !
    ce n'est pas de la mauvaise volonté, et l'incompréhension d'un domaine n'est pas toujours dû à une imbécilité prédominante !
    et quand on a déjà beaucoup de choses à apprendre et à décrypter, des fois ont fait des tirs en diagonale sur certaines choses, car par manque de temps on ne peut aller au fond de tous les domaines !:
    en particulier pour le web, la plus part des développeurs ou webmasters ne peuvent pas connaitre à 100% tous les langages utilisés !
    il y a différents niveaux d'apprentissage.

    Donc ça ne sert à rien de s'énerver lorsque quelqu'un n'entend pas directement les conseils qui lui sont aimablement donnés sur le forum !

    Je ne me sens pas personnellement visé par la qualification d'imbécile, mais même si certaines fois les débutants ne comprennent pas tout du premier coup, il faut du temps à tout le monde , et chacun a son propre rythme d'intégration.

    Merci pour le conseil, j'ai déjà parcouru de multiples sites sur le sql, tutos, cours etc.. il y en a des très bien faits, mais voilà tout n'est pas toujours mémorisé, même après plusieurs répétitions !
    croyez-moi, j'aimerai mémoriser et pouvoir réutiliser le tout dès la 1ere fois, ça serait un gain de temps et d'énergie considérable pour tout le monde !
    mais il n'en est pas ainsi .

    MErci donc à developpez.net et tous les autres forums, merci à ceux qui modèrent, rédigent, contribuent, aident et re-aident tous les membres. Heureusement qu'il y a ce partage de savoir pour que chacun apprenne et avance sur son chemin !

    je ne sais pas pour les autres, mais dans mon cas, je demande seulement lorsque j'ai cherché et que je n'ai pas trouvé de réponse, que je suis bloqué.

    et là, si je redemande, c'est parce que je ne comprend pas, cela va de soi
    loin de moi faire perdre du temps à qui que ce soit!

    bonne fin de dimanche

    A+
    B

  6. #6
    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
    Exprime ton besoin plus clairement, donne la structure exacte de tes tables, ce sera plus facile de t'aider.
    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 !

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

Discussions similaires

  1. Débutant, quelle est mon erreur ?
    Par vladimire dans le forum Servlets/JSP
    Réponses: 5
    Dernier message: 15/05/2009, 23h43
  2. [VC#] - Je ne comprends pas ou est mon erreur !
    Par epc dans le forum Windows Forms
    Réponses: 32
    Dernier message: 03/11/2008, 19h10
  3. Où est mon erreur ?
    Par diaruga dans le forum C#
    Réponses: 6
    Dernier message: 04/08/2008, 11h56
  4. [MySQL] Mais ou est mon erreur de syntax?
    Par pierrot10 dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 07/10/2006, 15h59
  5. Où est mon erreur ?
    Par Fusio dans le forum Langage
    Réponses: 5
    Dernier message: 07/04/2006, 17h29

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