Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/12/2010, 11h56   #1
Membre éprouvé
 
Avatar de gtraxx
 
Homme Aurélien Gérits
Développeur Web
Inscription : mai 2006
Messages : 1 045
Détails du profil
Informations personnelles :
Nom : Homme Aurélien Gérits
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2006
Messages : 1 045
Points : 498
Points : 498
Par défaut Erreur avec condition case when

Bonjour, je souhaite retourner uniquement les enregistrement qui contiennent une image.
Pour faire cette belle action, je me suis dit tiens faut une condition SQL.
J'ai alors entrepris d'utiliser un case dans ma requête mais impossible de faire un simple where sur le résultat.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SELECT p.idproduct, catalog.urlcatalog, catalog.titlecatalog, catalog.idlang, p.idclc, p.idcls, catalog.price,catalog.desccatalog,catalog.date_catalog, c.pathclibelle, s.pathslibelle, img.imgcatalog, lang.codelang,
CASE
	WHEN img.imgcatalog IS NULL
	THEN 0
	ELSE 1
	END AS imagecatalog
FROM mc_catalog_product AS p
    LEFT JOIN mc_catalog AS catalog ON ( catalog.idcatalog = p.idcatalog )
    LEFT JOIN mc_catalog_c AS c ON ( c.idclc = p.idclc )
    LEFT JOIN mc_catalog_s AS s ON ( s.idcls = p.idcls )
    LEFT JOIN mc_catalog_img AS img ON ( img.idcatalog = p.idcatalog )
    LEFT JOIN mc_lang AS lang ON ( catalog.idlang = lang.idlang )   
    WHERE p.idclc = 1 AND p.idcls = 0 AND catalog.idlang = 0 AND imagecatalog = 1
    ORDER BY catalog.date_catalog DESC
Cette requête me retourne que imagecatalog est indéfini :
Citation:
#1054 - Unknown column 'imagecatalog' in 'where clause'
Je me suis planter ou
__________________
Au petit déjeuner, je prend du PHP et au souper du jQuery.
AFUP 2009 : Bien optimiser son code pour le référencement
Mon projet open source de librairie PHP 5: magix cjquery
gtraxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 12h03   #2
Modérateur
 
Avatar de Bisûnûrs
 
Josselin
Développeur Web
Inscription : janvier 2004
Messages : 9 050
Détails du profil
Informations personnelles :
Nom : Josselin
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : janvier 2004
Messages : 9 050
Points : 12 181
Points : 12 181
Tu ne peux pas référence à un alias dans le WHERE, il faut utiliser HAVING (je me répète aujourd'hui).

De plus, je pense qu'il te suffit d'utiliser un simple JOIN au lieu d'un LEFT JOIN sur la table "mc_catalog_img" pour ne sélectionner que les enregistrements où il y a des images.
Bisûnûrs est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 12h10   #3
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Question con mais pourquoi ne pas faire simplement un test du non null ?

Code sql :
1
2
3
4
 
...
WHERE img.imgcatalog IS NOT NULL
...

vu que ton case te sert juste à filtrer les valeurs nulles et non nulles ?
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 12h10   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 967
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 967
Points : 18 197
Points : 18 197
Envoyer un message via MSN à CinePhil
Citation:
je souhaite retourner uniquement les enregistrements qui contiennent une image.
Pourquoi en effet faire une jointure externe ?
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 13h48   #5
Membre éprouvé
 
Avatar de gtraxx
 
Homme Aurélien Gérits
Développeur Web
Inscription : mai 2006
Messages : 1 045
Détails du profil
Informations personnelles :
Nom : Homme Aurélien Gérits
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2006
Messages : 1 045
Points : 498
Points : 498
Merci à vous,
Citation:
Pourquoi en effet faire une jointure externe ?
Heu tout simplement parce que je n'ai pas encore optimiser la requête, un simple INNER JOIN aurais fais l'affaire à la place de LEFT JOIN ?
Je viens de tester avec :
Code :
1
2
3
4
5
6
7
8
9
10
11
SELECT p.idproduct, catalog.urlcatalog, catalog.titlecatalog, catalog.idlang, p.idclc, p.idcls, catalog.price, catalog.desccatalog, catalog.date_catalog, c.pathclibelle, s.pathslibelle, img.imgcatalog, lang.codelang
FROM mc_catalog_product AS p
LEFT JOIN mc_catalog AS catalog ON ( catalog.idcatalog = p.idcatalog )
LEFT JOIN mc_catalog_c AS c ON ( c.idclc = p.idclc )
LEFT JOIN mc_catalog_s AS s ON ( s.idcls = p.idcls )
JOIN mc_catalog_img AS img ON ( img.idcatalog = p.idcatalog )
LEFT JOIN mc_lang AS lang ON ( catalog.idlang = lang.idlang )
WHERE p.idclc =1
AND p.idcls =0
AND catalog.idlang =0
ORDER BY catalog.date_catalog DESC
Sa fonctionne mais est ce optimisé ? comment optimisé cette requête de manière optimal
__________________
Au petit déjeuner, je prend du PHP et au souper du jQuery.
AFUP 2009 : Bien optimiser son code pour le référencement
Mon projet open source de librairie PHP 5: magix cjquery
gtraxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 15h37   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 967
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 967
Points : 18 197
Points : 18 197
Envoyer un message via MSN à CinePhil
Ma question était en rapport avec le besoin exprimé. La jointure externe va ramener tous les produits, y compris ceux qui ne contiennent pas d'image.

Pour les autres jointures, à vous de voir si tout produit est dans un catalogue, dans un catalog_c et dans un catalog_s. Pourquoi trois tables catalog d'ailleurs ? Héritage de tables ?

Je vois maintenant que d'après la condition de jointure, l'image semble plutôt s'associer au catalogue qu'au produit non ? Cette jointure ne devrait-elle pas alors être faite entre catalog et catalog_img ?

Difficile pour nous de vous aider à optimiser sans schéma de la BDD qui n'est pas forcément évident à déduire à partir de la requête.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/12/2010, 16h47   #7
Membre éprouvé
 
Avatar de gtraxx
 
Homme Aurélien Gérits
Développeur Web
Inscription : mai 2006
Messages : 1 045
Détails du profil
Informations personnelles :
Nom : Homme Aurélien Gérits
Âge : 30
Localisation : Belgique

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2006
Messages : 1 045
Points : 498
Points : 498
Effectivement il y a bien un héritage d'ou les tables multiples qui sont entièrement modulable l'une dépend de l'autre mais sans vraiment dépendre.
Pour l'explication :
catalog_c contient les catégories
catalog_s les sous catégories
catalog contient les produits orphelins
catalog_product contient uniquement des catalogues qui rend les produits disponible (table de liaisons).
Mais comme mon équipe me dit souvent la logique est vraiment bizarre chez toi mais sa fonctionne bien
grand merci, je vais tout de même faire attention avec les LEFT, RIGHT, INNER, NATURAL et JOIN
__________________
Au petit déjeuner, je prend du PHP et au souper du jQuery.
AFUP 2009 : Bien optimiser son code pour le référencement
Mon projet open source de librairie PHP 5: magix cjquery
gtraxx est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h41.


 
 
 
 
Partenaires

Hébergement Web