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 :

requete migrée de 4.1 à 5.0 ne renvoie plus rien (avec LEFT jointure)


Sujet :

Requêtes MySQL

  1. #1
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 347
    Points : 136
    Points
    136
    Par défaut requete migrée de 4.1 à 5.0 ne renvoie plus rien (avec LEFT jointure)
    bonjour,

    je dois convertir une requête mysql 4.1 vers 5.0. Je tiens à préciser que je ne suis pas responsable de la création de la requête originale.

    une fois changé la syntaxe de la partie LEFT JOIN, la requête ne renvoie plus rien alors qu'avant elle renvoyait 215 tuples.

    je ne comprends pas pourquoi.

    avant avec la 4.1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT distinct C1.libelle_categorie, C3.libelle_categorie, C2.libelle_categorie, C4.libelle_categorie, flag_phare, code_produit, if(denomination_vente1='', '...', concat(lower(denomination_vente1), ' ', denomination_vente2)) denomination_vente, if(flaveur='', ' ', flaveur) flaveur, if(degre_alcoolique='',' ',degre_alcoolique), if(miscibilite_eau=1,'Oui','Non'), if(miscibilite_huile=1,'Oui','Non'), if(miscibilite_alcool=1,'Oui', 'Non') ,if(AC3.valeur='' OR AC3.valeur='0',' ', AC3.valeur) dosage,trim(denomination_vente1) libel_domination_vente_1, trim(denomination_vente2) libel_domination_vente_2 FROM produit, article, caracter_arome CA, article_categorie AC0, categorie C0, article_categorie AC2, categorie C2, article_categorie AC4, categorie C4 , article_categorie AC3, categorie C3 LEFT JOIN article_categorie AC1, categorie C1 ON AC1.code_categorie=C1.code_categorie AND AC1.type_categorie=C1.type_categorie 
    WHERE produit.code_article=article.code_article AND article.code_article=AC1.code_article AND AC1.type_categorie='GOUT' AND article.code_article = CA.code_article AND article.code_article=AC0.code_article AND AC0.type_categorie=C0.type_categorie AND AC0.code_categorie=C0.code_categorie AND article.code_article=AC2.code_article AND AC2.type_categorie=C2.type_categorie AND AC2.code_categorie=C2.code_categorie AND article.code_article=AC3.code_article AND AC3.type_categorie=C3.type_categorie AND AC3.code_categorie=C3.code_categorie AND article.code_article=AC4.code_article AND AC4.type_categorie=C4.type_categorie AND AC4.code_categorie=C4.code_categorie AND article.flag_catalogue='O' AND C0.type_categorie='FAMILLE' AND C0.code_categorie='ARÔME' AND C2.type_categorie='STATUT' AND C4.type_categorie='FORME' AND C3.type_categorie='APPLICATION' AND C1.code_categorie = '1' ORDER BY C1.libelle_categorie, C3.libelle_categorie, C2.libelle_categorie, code_forme, flag_phare desc
    Après avec la 5.0:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT distinct C1.libelle_categorie, C3.libelle_categorie, C2.libelle_categorie, C4.libelle_categorie, flag_phare, code_produit, if(denomination_vente1='', '...', concat(lower(denomination_vente1), ' ', denomination_vente2)) denomination_vente, if(flaveur='', ' ', flaveur) flaveur, if(degre_alcoolique='',' ',degre_alcoolique), if(miscibilite_eau=1,'Oui','Non'), if(miscibilite_huile=1,'Oui','Non'), if(miscibilite_alcool=1,'Oui', 'Non') ,if(AC3.valeur='' OR AC3.valeur='0',' ', AC3.valeur) dosage,trim(denomination_vente1) libel_domination_vente_1, trim(denomination_vente2) libel_domination_vente_2 FROM produit, article, caracter_arome CA, article_categorie AC0, categorie C0, article_categorie AC2, categorie C2, article_categorie AC4, categorie C4 , article_categorie AC3, categorie C3 , article_categorie AC1 LEFT JOIN categorie C1 ON AC1.code_categorie=C1.code_categorie AND AC1.type_categorie=C1.type_categorie 
    WHERE produit.code_article=article.code_article AND article.code_article=AC1.code_article AND AC1.type_categorie='GOUT' AND article.code_article = CA.code_article AND article.code_article=AC0.code_article AND AC0.type_categorie=C0.type_categorie AND AC0.code_categorie=C0.code_categorie AND article.code_article=AC2.code_article AND AC2.type_categorie=C2.type_categorie AND AC2.code_categorie=C2.code_categorie AND article.code_article=AC3.code_article AND AC3.type_categorie=C3.type_categorie AND AC3.code_categorie=C3.code_categorie AND article.code_article=AC4.code_article AND AC4.type_categorie=C4.type_categorie AND AC4.code_categorie=C4.code_categorie AND article.flag_catalogue='O' AND C0.type_categorie='FAMILLE' AND C0.code_categorie='ARÔME' AND C2.type_categorie='STATUT' AND C4.type_categorie='FORME' AND C3.type_categorie='APPLICATION' AND C1.code_categorie = '1' ORDER BY C1.libelle_categorie, C3.libelle_categorie, C2.libelle_categorie, code_forme, flag_phare desc
    quelqu'un peut-il voir ce que je n'arrive pas à comprendre ?

    merci.

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Eh bah dis-donc !
    Pour moi, cette requête est imbuvable telle quelle est écrite.
    Il faudrait commencer par faire migrer ces conditions dans des clauses de jointures pour ne pas tout mélanger, filtrage et jointures
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    produit.code_article=article.code_article 
        AND article.code_article=AC1.code_article 
        AND article.code_article = CA.code_article 
        AND article.code_article=AC0.code_article 
        AND AC0.type_categorie=C0.type_categorie 
        AND AC0.code_categorie=C0.code_categorie 
        AND article.code_article=AC2.code_article 
        AND AC2.type_categorie=C2.type_categorie 
        AND AC2.code_categorie=C2.code_categorie 
        AND article.code_article=AC3.code_article 
        AND AC3.type_categorie=C3.type_categorie 
        AND AC3.code_categorie=C3.code_categorie 
        AND article.code_article=AC4.code_article 
        AND AC4.type_categorie=C4.type_categorie 
        AND AC4.code_categorie=C4.code_categorie
    D'autre part, mais j'en apprends tous les jours, je ne comprends pas cette syntaxe de jointure
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LEFT JOIN article_categorie AC1, categorie C1 
         ON AC1.code_categorie=C1.code_categorie AND AC1.type_categorie=C1.type_categorie
    Personnellement je l'aurait écrite comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LEFT JOIN article_categorie AC1
         ON AC1.code_categorie=C1.code_categorie AND AC1.type_categorie=C1.type_categorie

  3. #3
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 347
    Points : 136
    Points
    136
    Par défaut ok
    oui c'est normal, c'est l'ancienne syntaxe de mysql 3-4.1 (2005).

  4. #4
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut En résumé provisoire d'étape
    Il y a donc 5 tables
    produit
    article
    categorie
    caracter_arome
    et article_categorie
    La table article_categorie est une table de relation pour réaliser une jonction n,m entre les tables article et categorie. En réalité m=5, un article peut relever de 5 catégories seulement, d'où AC0-à-AC4 et C0-à-C4
    Il y a une relation entre produit et article et entre article et caracter_arome.
    Parmi toutes ces relations, seules les relations entre article et catégorie devraient être sollicitées par des LEFT JOIN afin de représenter d'éventuelles catégories 'GOUT' , 'FAMILLE', 'ARÔME', 'STATUT' , 'FORME' , 'APPLICATION', '1'

    Si j'ai bien tout capté.

  5. #5
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    bonjour,

    Ecris toute ta requête avec des jointures normalisées (inner join, left join, ...), cela rendra ta requête plus compréhensible

  6. #6
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Comme par ailleurs la table d'origine de certaines colonnes de la projection nous est inconnue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    flag_phare, denomination_vente1, denomination_vente2, flaveur, degre_alcoolique, miscibilite_eau, miscibilite_huile, miscibilite_alcool
    Un SHOW CREATE TABLE de chacune des cinq tables ne serait pas superflu.

  7. #7
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    347
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 347
    Points : 136
    Points
    136
    Par défaut ok
    oui c'est normal, c'est l'ancienne syntaxe de mysql 3-4.1 (2005).

Discussions similaires

  1. [Access] Requête avec LEFT JOIN et 3 tables
    Par estelledany dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/06/2006, 13h27
  2. [Optimisation] Requete trop lourde avec Left outer join...
    Par batosai dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/05/2006, 13h40
  3. requete avec double jointure externe
    Par cdu dans le forum Langage SQL
    Réponses: 8
    Dernier message: 04/01/2006, 14h54
  4. requete avec left join et group by
    Par slc dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/09/2004, 18h03
  5. requete avec 2 jointures
    Par bissy88 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 30/04/2004, 13h52

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