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 avec COALESCE et LEFT JOIN


Sujet :

Requêtes MySQL

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Points : 26
    Points
    26
    Par défaut pb avec COALESCE et LEFT JOIN
    Bonjour
    J'ai 2 tables, une table compagnie et une table categorie
    La table categorie associe les compagnies à 1 ou plusieurs categories.
    Par défaut une compagnie sans catégorie se trouve en catégorie 1.
    Voilà pour le décors.

    Je voudrai lister les compagnies suivant leurs categories.
    Si je fais:
    SELECT compagnie_id, COALESCE(categorie_categorie_id,1)AS categorie_id
    FROM compagnie
    LEFT JOIN categorie ON (categorie_compagnie_id=compagnie_id)
    ça marche sans problème
    mais si je veux "filtrer"
    SELECT compagnie_id, COALESCE(categorie_categorie_id,1)AS categorie_id
    FROM compagnie
    LEFT JOIN categorie ON (categorie_compagnie_id=compagnie_id)
    WHERE categorie_id=1
    J'ai l'erreur:
    #1054 - Unknown column 'categorie_id' in 'where clause'

    Quelqu'un a t il une idée de solution ?

    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
    Ton message d'erreur est clair : il ne connaît pas la colonne categorie_id. Il faut utiliser le vrai nom de la colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT compagnie_id, COALESCE(categorie_categorie_id,1) AS categorie_id
    FROM compagnie
    LEFT JOIN categorie ON (categorie_compagnie_id = compagnie_id)
    WHERE categorie_categorie_id = 1
    Par défaut une compagnie sans catégorie se trouve en catégorie 1.
    Cette valeur est elle enregistrée dans la table categorie ?
    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
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    Ton message d'erreur est clair : il ne connaît pas la colonne categorie_id. Il faut utiliser le vrai nom de la colonne :
    Sauf que si je fais ça, il ignore totalement les compagnies sans catégorie.

    Cette valeur est elle enregistrée dans la table categorie ?
    Ben non, ce serait trop simple.

    Pour info, cette requête sert de test pour une requête beaucoup compliquée sur 6 tables + 4 en jointure

  4. #4
    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
    OK alors reprenons...

    Avec la jointure externe, les compagnies sans catégorie donneront la colonne categorie_categorie_id à NULL. Si tu veux filtrer sur ces compagnies sans catégorie, il faut donc que ta restriction cherche ces NULL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT compagnie_id, COALESCE(categorie_categorie_id,1) AS categorie_id
    FROM compagnie
    LEFT JOIN categorie ON categorie_compagnie_id = compagnie_id
    WHERE categorie_categorie_id IS NULL
    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 !

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    Il faut comprendre que c'est une requête "dynamique" selon les cas et les situations, le script va chercher les compagnies de la catégorie 1 ou 5 ou 27.
    Donc je ne peux pas être aussi restrictif

  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
    Citation Envoyé par marochlo Voir le message
    Il faut comprendre que c'est une requête "dynamique" selon les cas et les situations, le script va chercher les compagnies de la catégorie 1 ou 5 ou 27.
    Donc je ne peux pas être aussi restrictif
    C'est ton script qui construit la requête en fonction des cas et des situations. Le WHERE est donc à construire dans ton script selon que les valeurs souhaitées existent (5 ou 27) :
    ==>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE categorie_categorie_id IN (5, 27)
    ou pas (1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE categorie_categorie_id IS NULL
    Si tu veux une combinaisons des deux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    WHERE categorie_categorie_id IN (5, 27)
      OR categorie_categorie_id IS NULL
    Après tu peux aussi transformer ta requête en une vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE VIEW v_compagnie_categorie AS
    SELECT compagnie_id, COALESCE(categorie_categorie_id, 1) AS categorie_id
    FROM compagnie
    LEFT JOIN categorie ON categorie_compagnie_id = compagnie_id
    Cette fois la colonne categorie_id existe et aura toujours une valeur. Tu peux donc directement interroger la vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT compagnie_id, categorie_id
    FROM v_compagnie_categorie
    WHERE categorie_id IN (1, 5, 27)
    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
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    Si tu veux une combinaisons des deux :

    WHERE categorie_categorie_id IN (5, 27)
    OR categorie_categorie_id IS NULL
    C'est ce que je vais faire, mais j'aurai préféré trouver quelque chose de "plus simple" qui m'aurait aussi servit aussi dans un autre contexte

    Après tu peux aussi transformer ta requête en une vue :
    Non merci, j'ai déjà 196 tables dans la base, je n'en rajoute pas

    Merci d'avoir pris le temps de me répondre

  8. #8
    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
    Citation Envoyé par marochlo Voir le message
    Non merci, j'ai déjà 196 tables dans la base, je n'en rajoute pas
    Ça fait effectivement beaucoup mais une vue n'est pas une table. C'est seulement une requête enregistrée que tu peux interroger comme si c'était une table. Ça ne duplique pas tes données.
    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 !

  9. #9
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2009
    Messages
    26
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mars 2009
    Messages : 26
    Points : 26
    Points
    26
    Par défaut
    Citation Envoyé par CinePhil Voir le message
    Ça fait effectivement beaucoup mais une vue n'est pas une table. C'est seulement une requête enregistrée que tu peux interroger comme si c'était une table. Ça ne duplique pas tes données.
    Faut voir, c'est peut être une idée à creuser compte tenu du contexte et des autres fonctions de ce script.
    C'est en terme de ressource serveur qu'il faut aussi considérer les choses, le serveur est assez chargé, je ne voudrais pas l'achever.
    Non seulement il y a beaucoup de table, mais en plus elles sont souvent très chargées (20 à 30000 lignes par table)

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

Discussions similaires

  1. Plantage Mysql avec LEFT JOIN
    Par verticka dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/09/2005, 11h45
  2. requete avec left join et group by
    Par slc dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/09/2004, 18h03
  3. Creer une requete avec des LEFT JOIN et des GRO
    Par donbuz dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/09/2004, 15h53
  4. 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
  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