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

SQL Procédural MySQL Discussion :

Calcul dans champ, where et order by


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Par défaut Calcul dans champ, where et order by
    Bonjour,

    J'ai fait une requete select qui effectue un gros calcul.
    Je récupère le résultat de ce calcul dans mes colonnes
    Ce calcul restreint les lignes retournées (where)
    et les lignes sont triées selon ce calcul
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Champ1, Champ2, [Gros calcul] AS Resultat
    FROM table1 INNER JOIN...
    WHERE [Gros calcul] < 100
    ORDER BY [Gros calcul]
    J'aimerais éviter d'avoir à écrire plusieurs fois la formule du calcul.
    Si je mets le nom de l'alias dans le ORDER BY
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Champ1, Champ2, [Gros calcul] AS Resultat
    FROM table1 INNER JOIN...
    WHERE [Gros calcul] < 100
    ORDER BY Resultat
    Cela fonctionne toujours

    Mais si j'essaies de mettre l'alias également dans le WHERE
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT Champ1, Champ2, [Gros calcul] AS Resultat
    FROM table1 INNER JOIN...
    WHERE Resultat < 100
    ORDER BY Resultat
    J'obtient une erreur de "colonne 'Resultat' inconnue"

    Est-il possible de ne pas écrire plusieurs fois ce calcul ?

    Pour info, voici le calcul :
    6376.5 * ACOS(COS(43.7667 * (PI() / 180)) * COS(Vil_Latitude * (PI() / 180)) * COS(Vil_Longitude * (PI() / 180) - 4.41667 * (PI() / 180)) + SIN(43.7667 * (PI() / 180)) * SIN(Vil_Latitude * (PI()/180)))
    Merci

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2005
    Messages
    390
    Détails du profil
    Informations personnelles :
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Février 2005
    Messages : 390
    Par défaut
    je te conseillerais de décomposer tout ça dans une procedure stocké ty gagneras en vitesse et en transparence

  3. #3
    Membre confirmé Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Par défaut
    Malheureusement je n'y connais rien en procédure stockée

  4. #4
    Membre confirmé Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Par défaut
    Ah, pardon, je précise que "Vil_Longitude" et "Vil_Latitude" sont des champs d'une des tables de la requètes.

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Par défaut
    Bonjour,

    A vue de nez, tu cherches les villes se trouvant dans un rayon de 100 km par rapport à une ville de référence ?

    S'il s'agit de ça, j'ai eu à faire ce genre de truc. Voilà le principe que j'ai utilisé.

    Préalablement à la requête, calcul des latitudes et longitudes maxi et mini, soit grosso modo :
    latitude_maxi = latitude_reference + 100 km
    latitude_mini = latitude_reference - 100 km
    longitude_maxi = longitude_reference + 100 km
    longitude_mini = longitude_reference - 100 km

    Ensuite, pour la requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT Champ1, Champ2, [Gros calcul] AS Resultat 
    FROM table1 INNER JOIN... 
    WHERE latitude between latitude_mini and latitude_maxi
    AND longitude between longitude_mini and longitude_maxi
    HAVING Resultat < 100
    Le WHERE limite la recherche à un carré de 100 km de côté, et le HAVING filtre les résultats du WHERE se trouvant à moins de 100 km.
    Je crois que HAVING est assez lent, mais du fait du 1er filtre effectué par le WHERE, les temps de réponse sont correctes.

    Il y a peut-être une meilleure solution, mais c'est tout ce que j'avais trouvé à l'époque.

  6. #6
    Membre confirmé Avatar de Ricou13
    Inscrit en
    Août 2002
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Août 2002
    Messages : 292
    Par défaut
    Salut,

    C'est exactement ça mais c'est le "gros calcul" qui détermine les villes.
    S'il y a donc un endroit au minimum où il doit se trouver, c'est dans le WHERE

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

Discussions similaires

  1. champs calculé dans la clause where
    Par Issam dans le forum Développement
    Réponses: 8
    Dernier message: 18/01/2011, 11h20
  2. Réponses: 3
    Dernier message: 26/09/2008, 17h52
  3. [Access 2003] Problème de calcul dans champ
    Par jacquesprogram dans le forum Access
    Réponses: 2
    Dernier message: 10/09/2006, 14h39
  4. Problème graphique & calcul dans champ
    Par jacquesprogram dans le forum Access
    Réponses: 1
    Dernier message: 08/09/2006, 15h09
  5. Calcul dans des champs de saisie
    Par leeloo076 dans le forum ASP
    Réponses: 4
    Dernier message: 07/04/2004, 10h09

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