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 :

Fonction stockée et filtre Bug ou erreur


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    Unknown column 'proximite' in 'where clause'
    Par contre si j'appel la fonction dans la clause WHERE une deuxieme fois :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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?

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    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 !

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    691
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 691
    Par défaut
    Merci.

    En cherchant plus j'ai rajouter la clause having et ca fonctionne !

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Par défaut
    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 ?
    vous devez donc rappeler votre fonction dans la clause WHERE

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

Discussions similaires

  1. Erreur (1064) lors de la compilation d'une fonction stockée
    Par jowo dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 02/02/2012, 07h45
  2. Réponses: 2
    Dernier message: 03/06/2005, 11h01
  3. fonctions stockées avec une table en argument
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 08/10/2004, 23h17
  4. afficher la définition d'une fonction stockée
    Par bdkiller dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 03/09/2004, 13h28
  5. Export des fonctions stockées
    Par bob_doulz dans le forum Oracle
    Réponses: 5
    Dernier message: 20/07/2004, 11h18

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