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 :

pb simple de left join [Fait]


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Par défaut pb simple de left join
    bien le bonjour,

    je développe un petit moteur de recherche, et actuellement j'utilise la requète suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT requete.*,themeRequete.themeRequete 
    from requete,rechercher,tag,themeRequete
    where requete.numRequete=rechercher.numRequete 
    and requete.numThemeRequete=themeRequete.numThemeRequete 
    and rechercher.numTag=tag.numTag 
    and tag.nomTag like 'e_%' 
    group by requete.descriptionRequete,requete
    malheureusement la clause WHERE ne me permet pas de récupérer les champs vide. En effet le champ requete.numRequete peut être vide. du cou je n'ais pas tous les champs que je voudrais.

    j'ai bien essayé de modifer ma requete
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT requete.*,themeRequete.themeRequete 
    from requete,rechercher,tag,themeRequete
    left join requete on requete.numRequete=rechercher.numRequete 
    where requete.numThemeRequete=themeRequete.numThemeRequete 
    and rechercher.numTag=tag.numTag 
    and tag.nomTag like 'e_%' 
    group by requete.descriptionRequete,requete
    mais j'ai l'erreur suivante : #1066 - Not unique table/alias: 'requete'
    que faire ???
    merci d'avance pour l'aide

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 063
    Par défaut
    Bonjour,

    Le problème exposé montre bien toute la limite de l'écriture des jointures selon la première version de la norme SQL.
    Il est préférable donc de les écrire selon la norme SQL2, en faisant les jointures avec des INNER JOIN plutôt qu'avec des "=" dans la clause WHERE...
    Quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT requete.*,themeRequete.themeRequete 
    FROM requete,rechercher,tag,themeRequete
    INNER JOIN themeRequete ON requete.numThemeRequete=themeRequete.numThemeRequete
    LEFT JOIN rechercher ON requete.numRequete=rechercher.numRequete 
    LEFT JOIN tag ON rechercher.numTag=tag.numTag 
    WHERE tag.nomTag LIKE 'e_%' 
    GROUP BY requete.descriptionRequete
    Je ne comprends pas bien l'intérêt de la jointure externe, vu que rien n'est affiché de la table "rechercher", ni le GROUP BY, mais bon...
    Pour t'en sortir, il faut prendre l'habitude d'écrire les requêtes de cette façon, c'est beaucoup plus puissant

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Par défaut
    re,

    bon je vais essayer d'ecrire en français ce que je souhaite faire cela sera plus parlant

    je veux afficher les informations de la requete (numRequete,descriptionRequete,numThemeRequete) et les thèmes(numThemeRequete,themeRequete) correspondant (même si la valeur de numThemeRequete dans la table requete est null et ne correspond a aucun theme dans la table ThemeRequete) quand dans la table tag(numTag,nomTag) le champ nomTag ressemble à "e_"

    la table rechercher(numRequete,numTag) lie requete et tag.

    ta requete me met Not unique table/alias: 'requete'

    alors je les modifiées d'après de ce que j'ai compris du tuto :
    http://sqlpro.developpez.com/cours/s...ointures/#L2.2

    et j'ai fait la requete suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT requete. * , themeRequete.themeRequete
    FROM requete, rechercher, tag, themeRequete
    INNER JOIN rechercher ON requete.numRequete = rechercher.numRequete
    INNER JOIN rechercher ON rechercher.numTag = tag.numTag
    LEFT JOIN themeRequete ON requete.numThemeRequete = themeRequete.numThemeRequete
    WHERE tag.nomTag LIKE 'e_art%'
    GROUP BY requete.descriptionRequete
    mais même chose
    #1066 - Not unique table/alias: 'rechercher'

    une idée ???

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Citation Envoyé par fongus
    En effet le champ requete.numRequete peut être vide
    Mes corrections en gras :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT requete.* , themeRequete.themeRequete
    FROM requete
    LEFT JOIN rechercher ON requete.numRequete = rechercher.numRequete
    LEFT JOIN tag ON rechercher.numTag = tag.numTag
    LEFT JOIN themeRequete ON requete.numThemeRequete = themeRequete.numThemeRequete
    WHERE tag.nomTag LIKE 'e_art%' or requete.numRequete IS NULL
    -- GROUP BY requete.descriptionRequete 
    -- à quoi ton GROUP BY est-il censé servir ???
    Citation Envoyé par fongus Voir le message
    une idée ???
    Relire le tuto ?

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    36
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 36
    Par défaut
    lol

    ok la requete fonctionne, maintenant quelques questions pour comprendre:
    Citation:
    Envoyé par fongus
    En effet le champ requete.numRequete peut être vide
    en fait c'est requete.numThemeRequete qui peut être vide. une requete n'a pas forcément un thème.

    bon je commence à comprendre comment fonctionne le left join, sinon effectivement le group by sert a rien puisqu'il y a une description par requete.
    pourquoi avoir mis requete.numRequete is null (à quoi ça sert) ?

    voila merci quand même

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 291
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 291
    Par défaut
    Citation Envoyé par fongus Voir le message
    lol

    ok la requete fonctionne, maintenant quelques questions pour comprendre:
    en fait c'est requete.numThemeRequete qui peut être vide. une requete n'a pas forcément un thème.
    Dans ce cas, les deux premières jointures sont à repasser en INNER JOIN, comme tu avais fait au début.
    Citation Envoyé par fongus Voir le message
    bon je commence à comprendre comment fonctionne le left join, sinon effectivement le group by sert a rien puisqu'il y a une description par requete.
    pourquoi avoir mis requete.numRequete is null (à quoi ça sert) ?
    A rien si tu fais un INNER JOIN sur tag.
    Dans l'hypothèse où le requete.numRequete pouvait être NULL et où je faisais une LEFT JOIN sur tag, ta condition LIKE 'e_art%' aurait éliminé les lignes où le requete.numRequete était NULL, et tu aurais perdu le bénéfice de la jointure externe. En effet, pour ces lignes-là, il n'y aurait pas eu de correspondance sur tag, et donc le tag.nomTag aurait été NULL, comme toutes les colonnes de tag.
    Plus généralement, le LEFT JOIN met en place un côté obligatoire (requete) et un côté facultatif (tag). Quand on pose des conditions sur le côté facultatif, il faut toujours prévoir que les colonnes facultatives vont être NULL dans les cas de non-correspondance.

  7. #7
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 063
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 063
    Par défaut
    Citation Envoyé par fongus Voir le message
    ta requete me met Not unique table/alias: 'requete'
    Ah ben oui, là c'est 2 claques pour moi !!!
    Il faut, pour éviter l'erreur, ne mettre qu'une seule table après le FROM, puis les autres tables dans les jointures. J'ai recopié trop rapidement ta requête...
    Désolé...

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

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

Discussions similaires

  1. count() dans *plusieurs* LEFT JOIN
    Par silver_dragoon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 28/06/2004, 17h20
  2. LEFT JOIN avec Oracle 8i ne va pas... doit utiliser (+)
    Par loikiloik dans le forum Langage SQL
    Réponses: 10
    Dernier message: 21/04/2004, 16h38
  3. Interbase et left join
    Par Zog dans le forum Bases de données
    Réponses: 4
    Dernier message: 23/03/2004, 08h55
  4. Non coincident MySQL (Left Join)
    Par Remiguel dans le forum Requêtes
    Réponses: 6
    Dernier message: 03/11/2003, 21h25
  5. Export d'une vue avec LEFT JOIN
    Par schnourf dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 22/05/2003, 13h57

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