[MySQL] condition sur un alias

condition sur un alias [MySQL] - SQL/NoSQL - Programmation

Marsh Posté le 12-05-2008 à 06:13:11    

Bonjour,
 
Je me trouve confronté à un problème avec MySQL 5.0.51b-community-ntqui qui apparemment a été abordé plusieurs fois, mais je n'ai pas trouvé de réponse satisfaisante.
Voici mon problème :
 
Imaginons deux tables :
 
EMPLOYES      SALAIRES
----------      --------
ID_EMPLOYE   ID_SALAIRE
NOM              ID_EMPLOYE
                    SALAIRE
 
dans la table employé on trouve :
 
1 DUPONT
2 DURAND
 
et dans la table salaires :
 
1 2 1500
 
maintenant j'execute la requete suivante :
 

Code :
  1. SELECT
  2. e.nom, s.salaire AS 'salaire en euros'
  3. FROM
  4. employes e
  5. LEFT OUTER JOIN salaires s
  6. ON s.id_employe = e.id_employe
  7. GROUP BY e.id_employe
  8. HAVING 'salaire en euros' > 100


 
La requête va me sortir aucun résultat. Si par contre je met entre quote '100' à ce moment là ca me sort tous les résultats.
Je suis obligé de passer par un GROUP BY, d'après le manuel de MySQL 5, il est impossible de faire un WHERE sur un alias, il faut à la place utiliser HAVING.
 
Je suis bien embêté car je fais un système un peu dynamique en PHP, et j'ai besoin de mettre un alias aux colonnes, et je suis surtout obligé d'utiliser le nom de colonne renvoyé par MySQL et le réutiliser dans le HAVING.
 
Si quelqu'un a une slution ultime, je suis preneur.
Merci

Reply

Marsh Posté le 12-05-2008 à 06:13:11   

Reply

Marsh Posté le 12-05-2008 à 10:38:37    

SELECT *
FROM  
(
SELECT e.nom, s.salaire AS 'salaire en euros'
FROM employes e LEFT OUTER JOIN salaires s ON s.id_employe = e.id_employe
) as Result
WHERE 'salaire en euros' > 100;
 
ou si plusieurs lignes dans SALAIRE pour un employé
 
SELECT *
FROM  
(
SELECT e.nom, sum(s.salaire) AS 'salaire en euros'
FROM employes e LEFT OUTER JOIN salaires s ON s.id_employe = e.id_employe
GROUP BY e.nom
) as Result
WHERE 'salaire en euros' > 100;
 
Je ne sais pas si ça marche avec MySQL. En tout cas, ça marche avec ORACLE et SQL SERVER.


Message édité par moi23372 le 12-05-2008 à 10:40:45
Reply

Marsh Posté le 12-05-2008 à 10:39:47    

Euuuh, pourquoi tu fais un group by, là, concrètement ? [:petrus75]
 

Code :
  1. SELECT e.nom, s.salaire AS salaire_en_euros
  2. FROM employes e
  3. LEFT OUTER JOIN salaires s ON s.id_employe = e.id_employe
  4. WHERE salaire_en_euros > 100


 
[:autobot]


---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 12-05-2008 à 13:38:12    

sielfried a écrit :

Euuuh, pourquoi tu fais un group by, là, concrètement ? [:petrus75]
 

Code :
  1. SELECT e.nom, s.salaire AS salaire_en_euros
  2. FROM employes e
  3. LEFT OUTER JOIN salaires s ON s.id_employe = e.id_employe
  4. WHERE salaire_en_euros > 100


 
[:autobot]


 

bastok a écrit :


Je suis obligé de passer par un GROUP BY, d'après le manuel de MySQL 5, il est impossible de faire un WHERE sur un alias, il faut à la place utiliser HAVING.


 
Et pour utiliser HAVING, faut un GROUP BY

Reply

Marsh Posté le 12-05-2008 à 14:47:05    

Non, en MySQL ce n'est pas du tout obligatoire (edit: à partir de MySQL 5.0.2 pour avoir vérifié, donc bon pour toi.)
 
Et sinon suffit de faire ta condition directement sur s.salaire ? [:petrus75]
 
(À moins que t'ais simplifié la chose pour l'exemple, et que ce soit en fait une donnée calculée. Dans ce cas HAVING marche très bien.)


Message édité par sielfried le 12-05-2008 à 14:49:47

---------------
StarCraft Professional Gaming Database | [Ze Topic] Starcraft/BroodWar
Reply

Marsh Posté le 12-05-2008 à 14:47:40    

Code :
  1. SELECT e.nom, s.salaire AS salaire_en_euros
  2.     FROM employes e
  3.     LEFT OUTER JOIN salaires s ON s.id_employe = e.id_employe
  4.     WHERE s.salaire > 100


 
pas la peine d'utiliser ton alias dans le filtre ...

Reply

Marsh Posté le 13-05-2008 à 10:43:11    

bastok a écrit :


Code :
  1. SELECT
  2. e.nom, s.salaire AS 'salaire en euros'
  3. FROM
  4. employes e
  5. LEFT OUTER JOIN salaires s
  6. ON s.id_employe = e.id_employe
  7. GROUP BY e.id_employe
  8. HAVING 'salaire en euros' > 100



100 => le nombre 100
'100' => la chaîne de caractères 100
'salaire en euros' => la chaîne de caractères 'salaire en euros'
"salaire en euros" => l'alias pour un nombre

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed