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

  1. #1
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 115
    Points : 43
    Points
    43
    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
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    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. Autoentrepreneur.
    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 du Club
    Inscrit en
    Juillet 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 115
    Points : 43
    Points
    43
    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 770
    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 770
    Points : 52 726
    Points
    52 726
    Billets dans le blog
    5
    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 du Club
    Inscrit en
    Juillet 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 115
    Points : 43
    Points
    43
    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
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    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. Autoentrepreneur.
    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 !

  7. #7
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 115
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Exprime ton besoin plus clairement, donne la structure exacte de tes tables, ce sera plus facile de t'aider.
    Hello cinePhil,

    j'avais tenté dans le 2Er post de bien expliquer.
    voilà les structures :
    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
    28
     
    CREATE TABLE IF NOT EXISTS `p_rating_types` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nom_type` varchar(100) NOT NULL,
      `value_type` varchar(100) NOT NULL,
      `static` int(1) NOT NULL,
      `statut` tinyint(1) NOT NULL,
      `ordre` tinyint(1) NOT NULL,
      UNIQUE KEY `type` (`nom_type`),
      UNIQUE KEY `id` (`id`)
    )
     
    CREATE TABLE IF NOT EXISTS `p_rate_types_list` (
      `id_list` int(11) NOT NULL,
      `id_type` int(11) NOT NULL,
      `active` int(11) NOT NULL,
      KEY `id_list` (`id_list`)
    )
     
    //j'ajoute une autre table qui n'est pas dans la requete, car elle est en amont dans le code, dans une autre partie .
    CREATE TABLE IF NOT EXISTS `p_rating_list` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `nom_list` varchar(100) NOT NULL,
      `statut` tinyint(1) NOT NULL,
      `ordre` tinyint(1) NOT NULL,
      UNIQUE KEY `type` (`nom_list`),
      UNIQUE KEY `id` (`id`)
    )

    Je souhaite avoir les nom, id et active de la table 2 en fonction des id list comprendant tous les id_types possibles

    comme je le disais, soit j'ai la liste de tous les id_types et id_name présentes en table 2 mais avec un active false,
    soit j'ai les id_types et name_type uniquement listés dans la 1ere table avec les active true.

    je ne sais comment expliquer mieux!

    peut-être avec des questions pour m'orienter !?

    en fait j'ai une liste de checkbox (les types) en fonction de listes (id-list)
    mais tous les id_types ne sont pas dans la table.

    Merci pour l'aide

    et bonne fin de soirée

  8. #8
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 115
    Points : 43
    Points
    43
    Par défaut
    Bonsoir,

    voilà , me revoilà, après avoir réglé d'autres parties de ce code, il ne me reste quasi plus que cela . mais je dois débloquer cela.

    et c'est là que je me retourne vers vous !

    j'ai toujours pas les résultats dont j'ai besoin

    dans la requete précédente, il manquait le select en fonction de l'id de la liste présente id passé en get.

    donc j'ai la requete suivante :
    Code : 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 rt.statut=1 AND rtl.id_list=4 ORDER BY rt.id ASC
    j'ai tenté de mettre le rtl.id_list dans le INNER JOIN sans succès

    une ou des idées pour m'aider à résoudre ce problème ?

    merci
    bonne fin de soirée
    B

  9. #9
    Membre expérimenté
    Homme Profil pro
    Ingenieur de recherche - Ecologue
    Inscrit en
    Juin 2003
    Messages
    1 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingenieur de recherche - Ecologue

    Informations forums :
    Inscription : Juin 2003
    Messages : 1 146
    Points : 1 412
    Points
    1 412
    Par défaut
    SVP s'il s'agit d'un nouveau questionnement, faites un nouveau post

    Sur le fond, je n'ai rien compris (suis-je le seul ?)
    Et je ne vois pas de problème dans l'écriture de la requête
    Merci d'ajouter un sur les tags qui vous ont aidé

  10. #10
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 115
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par dehorter olivier Voir le message
    SVP s'il s'agit d'un nouveau questionnement, faites un nouveau post

    Sur le fond, je n'ai rien compris (suis-je le seul ?)
    Et je ne vois pas de problème dans l'écriture de la requête
    Bonjour,

    non ce n'est pas un nouveau sujet.
    c'est le même que je souhaite résoudre.

    la syntaxe de la requête est juste oui, mais les résultats souhaités ne sont pas présents.
    dans le post précédent j'ai expliqué ce que je souhaitais obtenir , en vain.
    d'où mon nouveau post !

    ici sont les professionnels en bdd, je pense être au meilleur endroit pour demander de l'aide.

    pour rappel , peut etre avec de meilleurs termes :

    je souhaite avoir en résultats

    l'ensemble des types possibles (tous les noms et id , statut à 1) de la table rating_types mixés avec tous les id de types présents dans table rate_list_types dont je remonte la valeur "active" .
    car tous les id de types présents dans rating_types ne sont pas présents dans rate_list_types.

    je souhaite donc la liste de tous les id et noms de types possibles avec les valeurs de active pour ceux présents dans la table rate_list_type .

    car pour l'instant je n'ai pas tous les id et types possible qui arrivent dans les résultats.

    voilà je pense avoir été plus clair sur cette formulation.

    merci de votre aide...
    bonne journée

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    je part du 1er poste ou vous stipulez que vous voullez un mixte de 2 requête, vu que je n'ai pas compri votre besoin dans vos 2 derniers postes.


    connaisssez-vous les jointures externe ? http://sqlpro.developpez.com/cours/sqlaz/jointures/


    Sinon regardez du côté de UNION / UNION ALL

  12. #12
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    pour rappel , peut etre avec de meilleurs termes :

    je souhaite avoir en résultats

    l'ensemble des types possibles (tous les noms et id , statut à 1) de la table rating_type
    Jusque là, je comprends.

    mixés avec tous les id de types présents dans table rate_list_types
    "mixer" n'est pas un verbe que je puisse comprendre facilement dans le contexte des bases de données relationnelles.

    Lisez les règles de ce forum et appliquez-les, lisez la phrase en bleu de ma signature et appliquez son principe, vous aurez ainsi plus de chance d'avoir une réponse satisfaisante.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  13. #13
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 115
    Points : 43
    Points
    43
    Par défaut
    de là à connaitre complètement le language sql non, mais oui j'ai testé les jointures externes,
    j'ai testé beaucoup de choses c'est pour cela que je pose la question !

    demander les solutions toutes faites sans chercher au préalable n'est pas mon genre.

    dans ce cas là la outer join ne fonctionne pas , UNION non plus

    bon le verbe mixé n'est pas juste, mais si j'utilise "filtrés" peut être plus ?

    "ce qui ce conçoit bien .... "
    j'ai grandi en entendant cette phrase que mon père répétait tout le temps... alors oui, je fais de mon mieux !

    je vais tenter d'expliquer encore mieux

    j'ai dans une table de types avec id nom et statut
    j'ai une table avec des listes id, nom et statut
    et une table de liaison avec les id des listes, les id des types et la valeur active

    jusqu'ici pas dur

    je veux lister tous les types qu'ils soient présents ou non dans la table de liaison pour une liste X, et si il sont présents avec une valeur active dans cette table de liaison alors je ressort avec cette valeur.

    donc qu'ils soient présents ou non dans la table de liaison , je veux tous les types en sortie, et si ils sont présent dans la table en fonction de l'id de la liste en cours, alors je ressort leur valeur active...

    est-ce plus clair ?

    merci de votre patience...

  14. #14
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Arrêtez vos explications fleuves qui sont incompréhensibles et qui peuvent agacer ceux qui essaient de vous venir en aide.

    Commençons par poser le problème de façon analytique.
    Répondez à toutes ces questions, dans l'ordre et sans fioritures.

    1) Un jeu de test simple mais représentatif de votre problématique.
    Si celui du premier message est toujours valide, recopiez-le.

    2) Le résultat que vous attendez en sortie de requête.

    3) La requête que vous avez essayée.
    Si c'est la même que dans le huitième message du sujet, recopiez là.

  15. #15
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 115
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Waldar Voir le message
    Arrêtez vos explications fleuves qui sont incompréhensibles et qui peuvent agacer ceux qui essaient de vous venir en aide.

    Commençons par poser le problème de façon analytique.
    Répondez à toutes ces questions, dans l'ordre et sans fioritures.

    1) Un jeu de test simple mais représentatif de votre problématique.
    Si celui du premier message est toujours valide, recopiez-le.

    2) Le résultat que vous attendez en sortie de requête.

    3) La requête que vous avez essayée.
    Si c'est la même que dans le huitième message du sujet, recopiez là.
    Ma dernière explication n'a pas du être plus claire...
    Désolé

    Alors, je répond au mieux, sans fioritures

    1/ je ne recopie pas les tables, elles sont dans le post 7
    1ere requête
    Code : 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 (rtl.id_list=4) WHERE rt.id = rtl.id_type ORDER BY rt.id ASC
    me renvoie la liste des types et leur état (active) présents pour la liste 4 dans la table de typ_list

    la 2eme requête
    Code : 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 (rtl.id_list=4) WHERE rt.statut=1 GROUP BY rt.id ORDER BY rt.id ASC
    me renvoie tous les types existants dans la table rating_types mais sans leur état, de la table typ_list (tous semblent être à 1)

    une image pour la représentation visuelle


    2/
    en sortie je voudrais la liste de tous les types existants (comme en requête 2) mais avec la valeur active présente dans typ_list pour chacun de ces types, si il n'existe pas, il est à 0 (donc décoché), mais tout de même listé

    3/
    la dernière requête que j'ai essayé
    Code : 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 rt.statut=1 AND rtl.id_list=4 ORDER BY rt.id ASC
    qui me donne le même résultat qu'en requête 1

    j'ai fait de mon mieux pour répondre.
    merci de votre patience.

    bonne soirée

  16. #16
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    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 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    La première requête devrait être écrite comme ça :
    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
    WHERE rtl.id_list = 4
    => La condition de jointure après le ON et la condition de restriction après le WHERE.

    j'ai dans une table de types avec id nom et statut
    C'est la table "p_rating_types" ?
    j'ai une table avec des listes id, nom et statut
    C'est quelle table ?
    une table de liaison avec les id des listes, les id des types et la valeur active
    C'est la table "p_rate_types_list" ?

    je veux lister tous les types qu'ils soient présents ou non dans la table de liaison
    Il faut donc une jointure externe de la table des types vers la table de liaison. Mais comme la condition de restriction porte sur la table externe (la table de liaison), il faut importer la condition de restriction dans la condition de jointure, sinon on transforme la jointure externe en jointure interne. Voir mon blog pour les explications et démonstration complète.

    Voici la requête avec la jointure externe :
    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 
    LEFT OUTER JOIN p_rate_types_list rtl 
    	ON rt.id = rtl.id_type
    	AND rtl.id_list = 4
    Elle sélectionne les types et la valeur active, si elle existe pour le type (si
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    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 !

  17. #17
    Membre du Club
    Inscrit en
    Juillet 2006
    Messages
    115
    Détails du profil
    Informations forums :
    Inscription : Juillet 2006
    Messages : 115
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par CinePhil Voir le message

    => La condition de jointure après le ON et la condition de restriction après le WHERE.
    AH voilà un conseil très utile dont je tâcherai de me rappeler.

    Voici la requête avec la jointure externe :
    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 
    LEFT OUTER JOIN p_rate_types_list rtl 
    	ON rt.id = rtl.id_type
    	AND rtl.id_list = 4
    Elle sélectionne les types et la valeur active, si elle existe pour le type (si
    bon bah ça fonctionne nickel.
    je n'étais pas loin, mais dans ce domaine "pas loin" ne fonctionne en général pas.
    merci beaucoup pour votre patience et votre aide .

    je note le
    vec une jointure externe, il faut déplacer les conditions de restriction sur la table externe du WHERE vers la condition de jointure. Sinon c'est l'équivalent d'une jointure interne.
    de ton blog !

    je poste donc enfin de sujet en résolu !
    Merci encore Cinephil

+ 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