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 24/01/2012, 16h27   #1
Membre habitué
 
Inscription : mai 2008
Messages : 285
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : mai 2008
Messages : 285
Points : 111
Points : 111
Par défaut Condition sur un champ renommé

Bonjour à tous,

Je renomme un champ en ID__FILTRE pour pouvoir mettre une condition:
Voici ma requête:
Code :
1
2
3
4
5
6
SELECT  
(CASE WHEN aa.id_filtre IS NULL THEN od.id_filtre ELSE aa.id_filtre END) AS ID__FILTRE , 
(CASE WHEN aa.id_sous_filtre IS NULL THEN od.id_sous_filtre ELSE aa.id_sous_filtre END) AS ID__SOUS__FILTRE 
FROM operation_depenses od 
LEFT JOIN achat_articles aa ON aa.id_achat=od.id_achat_articles
WHERE (od.date BETWEEN '2011-07-20 01:31:01' AND '2011-08-25 23:00:00') AND ID__FILTRE=7
Le problème est qu'il me met #1054 - Unknown column 'ID__FILTRE' in 'where clause'
Bref il cherche un champ qui n'existe pas!
Comment faire?

Merci
peofofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 16h57   #2
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 531
Points : 3 524
Points : 3 524
Saluton,
Le champ n'est pas renommé mais aliassé, mais peu importe.

Un alias n'est pas connu au moment du WHERE, mais MySQL étant laxiste, il t'autorise une clause HAVING sans GROUP BY, et la clause HAVING, elle, connait les alias.
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/01/2012, 18h49   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
Plus proprement que ce que propose Maljuna Kris, tu dois aussi pouvoir mettre le CASE dans le WHERE.
Puisque tu filtres sur la valeur de ce CASE, sa présence dans le SELECT n'est pas très utile.
__________________
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 25/01/2012, 03h51   #4
Expert Confirmé
 
Avatar de Maljuna Kris
 
Homme Avcxjo MoKo
Retraité
Inscription : novembre 2005
Messages : 2 531
Détails du profil
Informations personnelles :
Nom : Homme Avcxjo MoKo
Âge : 60

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

Informations forums :
Inscription : novembre 2005
Messages : 2 531
Points : 3 524
Points : 3 524
Citation:
Envoyé par CinePhil Voir le message
tu dois aussi pouvoir mettre le CASE dans le WHERE.
Puisque tu filtres sur la valeur de ce CASE, sa présence dans le SELECT n'est pas très utile.
Je ne vois pas trop comment.
Par contre, bien mieux que ma réponse si peu orthodoxe
Code mysql :
WHERE (od.date BETWEEN '2011-07-20 01:31:01' AND '2011-08-25 23:00:00') AND ( aa.id_filtre=7 OR od.id_filtre =7)
__________________
Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
articles : Comment émuler un tableau croisé [quasi] dynamique
et : Une énigme mathématique résolue avec MySQL
recommande l'utilisation de PDO (PHP5 Data Objects)
Maljuna Kris est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 06h34   #5
Membre habitué
 
Inscription : mai 2008
Messages : 285
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : mai 2008
Messages : 285
Points : 111
Points : 111
Merci a tous les deux

Excusez-moi pour l'emploi des mauvais termes.
Cette requête s'écrierait ainsi:
Code :
1
2
3
4
SELECT  * FROM operation_depenses od 
LEFT JOIN achat_articles aa ON aa.id_achat=od.id_achat_articles
WHERE (od.date BETWEEN '2011-07-20 01:31:01' AND '2011-08-25 23:00:00') 
AND (CASE WHEN aa.id_filtre IS NULL THEN od.id_filtre ELSE aa.id_filtre END)=7
La requête serait juste?
peofofo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/01/2012, 09h12   #6
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
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 : 11 029
Points : 18 331
Points : 18 331
Envoyer un message via MSN à CinePhil
C'est à ce genre de truc que je pensais mais je n'ai pas testé.
Par contre, la seconde solution de Maljuna Kris me semble bien meilleure... si elle donne le bon résultat !
Est-il possible que dans tes données tu aies un aa.id_filtre non null et différent de 7 et un od.id_filtre = 7 ?
Auquel cas il faudrait faire ceci :
Code :
1
2
3
4
5
6
7
8
9
10
11
WHERE od.date BETWEEN '2011-07-20 01:31:01' AND '2011-08-25 23:00:00' 
	AND 
	( 
		aa.id_filtre = 7 
		OR 
		(
			aa.id_filtre IS NULL
			AND 
			od.id_filtre =7
		)
	)
__________________
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 26/01/2012, 13h57   #7
Membre habitué
 
Inscription : mai 2008
Messages : 285
Détails du profil
Informations personnelles :
Âge : 27
Localisation : France, Loire (Rhône Alpes)

Informations forums :
Inscription : mai 2008
Messages : 285
Points : 111
Points : 111
Merci CinéPhil,

La requête fonctionne a merveille:
Code :
1
2
3
4
SELECT  * FROM operation_depenses od 
LEFT JOIN achat_articles aa ON aa.id_achat=od.id_achat_articles
WHERE (od.date BETWEEN '2011-07-20 01:31:01' AND '2011-08-25 23:00:00') 
AND (CASE WHEN aa.id_filtre IS NULL THEN od.id_filtre ELSE aa.id_filtre END)=7
La requête de Maljuna Kris ne donne pas le bon résultat!
Car avec la jointure j'ai des champs null. Et je cherche a regrouper les 2 champs filtres pour ne plus avoir une seule ligne null et ensuite mettre une condition sur cette colonne.

Merci à tous les deux

Problème résolu
peofofo 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 23h48.


 
 
 
 
Partenaires

Hébergement Web