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 27/02/2011, 10h53   #1
Membre éclairé
 
Inscription : décembre 2004
Messages : 658
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 658
Points : 317
Points : 317
Par défaut Fonction stockée et filtre Bug ou erreur

Bonjour,

J'effectue actuellement une requete avec une fonction stocké pour des distances de GPS.

voici ma requete
Code :
1
2
3
4
5
6
 
SELECT m.id AS m_id, m.n_rue AS n_rue, m.rue AS rue, m.latitude AS m_latitude, m.longitude AS m_longitude, e.id AS e_id, e.nom AS e_nom, e.logo AS logo, v.code_INSEE AS code_INSEE, v.nom AS v_nom, v.cp AS cp,
get_distance_metres('48.86669921875', '2.33332991600037', m.latitude, m.longitude) AS proximite 
FROM magasin m JOIN enseigne e ON (m.id_enseigne = e.id) JOIN ville v ON (v.code_INSEE = m.code_INSEE)
WHERE v.code_INSEE != 75110 AND m.valide = 1 AND proximite < 1000
ORDER BY proximite ASC, e.nom, v.nom, m.rue LIMIT 9
Au milieu je met un allias "proximite" sur une fonction:
Code :
1
2
 
get_distance_metres('48.86669921875', '2.33332991600037', m.latitude, m.longitude) AS proximite
dans la clause ORDER je trie par cette allias et ca fonctionne.
Par contre quand je veux limiter dans le where sur cet allias :
J'ai une erreur :
Citation:
Unknown column 'proximite' in 'where clause'
Par contre si j'appel la fonction dans la clause WHERE une deuxieme fois :
Code :
1
2
 
get_distance_metres('48.86669921875', '2.33332991600037', m.latitude, m.longitude)<1000
La ca fonctionne.

Je fais quelque chose de mal ou c'est un bug de mysql?
__________________
Pour me faire grandir
zulot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 16h40   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

La clause WHERE est appliquée avant l'évaluation des colonnes de votre SELECT, et votre alias n'est donc pas encore défini.

vous devez donc rappeler votre fonction dans la clause WHERE. Mais cela ne vous en coûtera qu'un copier/coller...

Ce n'est pas un bug, c'est le fonctionnement normal !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/03/2011, 13h23   #3
Membre éclairé
 
Inscription : décembre 2004
Messages : 658
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : décembre 2004
Messages : 658
Points : 317
Points : 317
Merci.

En cherchant plus j'ai rajouter la clause having et ca fonctionne !
__________________
Pour me faire grandir
zulot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 10h21   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par zulot Voir le message
Merci.

En cherchant plus j'ai rajouter la clause having et ca fonctionne !
En effet, à l'inverse de la clause WHERE, les conditions de la clause HAVING sont évaluées après quetoutes les données ont été lues (en appliquant les conditions de la clause where), et après que les jointures et agrégats ont été effectués.

C'est pour cela que ça fonctionne, et c'est pour cela que c'est aussi beaucoup moins performant ! en gros, vous demandez à votre SGBD de faire un travail énorme, pour lui dire au final que seule une infime partie des données qu'il a récupérée, comparées, filtrées,... vous interesse !

Qu'est-ce qui vous gène dans solution que vous aviez trouvée et que je vous avais conseillé d'utiliser ?
Citation:
vous devez donc rappeler votre fonction dans la clause WHERE
aieeeuuuuu 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 17h18.


 
 
 
 
Partenaires

Hébergement Web