Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en 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 16/03/2007, 18h36   #1
Membre actif
 
Avatar de Ricou13
 
Inscription : août 2002
Messages : 291
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 291
Points : 175
Points : 175
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 :
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 :
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 :
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 :
Citation:
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
__________________
il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
Des fois ça malche, des fois ça malche pas. Garcimore
Ricou13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2007, 18h55   #2
Membre éclairé
 
Inscription : février 2005
Messages : 349
Détails du profil
Informations personnelles :
Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : février 2005
Messages : 349
Points : 358
Points : 358
je te conseillerais de décomposer tout ça dans une procedure stocké ty gagneras en vitesse et en transparence
overider est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2007, 18h58   #3
Membre actif
 
Avatar de Ricou13
 
Inscription : août 2002
Messages : 291
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 291
Points : 175
Points : 175
Malheureusement je n'y connais rien en procédure stockée
__________________
il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
Des fois ça malche, des fois ça malche pas. Garcimore
Ricou13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/03/2007, 19h00   #4
Membre actif
 
Avatar de Ricou13
 
Inscription : août 2002
Messages : 291
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 291
Points : 175
Points : 175
Ah, pardon, je précise que "Vil_Longitude" et "Vil_Latitude" sont des champs d'une des tables de la requètes.
__________________
il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
Des fois ça malche, des fois ça malche pas. Garcimore
Ricou13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/03/2007, 09h24   #5
Membre Expert
 
Inscription : août 2002
Messages : 1 036
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 1 036
Points : 1 166
Points : 1 166
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 :
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.
jeca est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2007, 00h40   #6
Membre actif
 
Avatar de Ricou13
 
Inscription : août 2002
Messages : 291
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 291
Points : 175
Points : 175
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
__________________
il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
Des fois ça malche, des fois ça malche pas. Garcimore
Ricou13 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2007, 19h19   #7
Membre Expert
 
Inscription : août 2002
Messages : 1 036
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 1 036
Points : 1 166
Points : 1 166
Bonjour,

Compte-tenu de ta réponse, j'ai voulu en avoir le coeur net. J'ai donc fait un essai comparatif de délai d'éxécution entre le calcul dans la clause 'WHERE' et ma solution.

La solution que j'ai utilisée est 2 fois plus rapide, ce qui me semble logique. En effet, si le calcul se trouve dans la clause 'WHERE', il est évalué pour chaque ligne de la table ; alors qu'avec un filtre sur les coordonnées mini et maxi, il ne l'est que pour les éléments résultants du filtre. Et la clause 'HAVING' s'effectuant en dernier lieu ne s'applique que sur ces éléments.
jeca est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/03/2007, 19h37   #8
Membre actif
 
Avatar de Ricou13
 
Inscription : août 2002
Messages : 291
Détails du profil
Informations forums :
Inscription : août 2002
Messages : 291
Points : 175
Points : 175
Salut,

Autant pour moi. Je pensais que tu me proposait une solution pour déterminer les villes concernées en te servant d'une formule à base de carré.
Or, ma formule détermine les villes directement depuis un cercle.

Mais en fait, tu me propose de restreindre sur un carré (simple en terme de calcul du WHERE) et le HAVING s'occupera d'éliminer toutes les villes qui ne sont pas dans le cercle.

Comme il ne semble pas y avoir de possibilite de mettre quelque chose du genrecela me semble effectivement être une excellente réponse (surtout si elle est plus rapide)

Merci
__________________
il ne faut pas de tout pour faire un monde. Il faut du bonheur et rien d'autre. Paul Eluard
Des fois ça malche, des fois ça malche pas. Garcimore
Ricou13 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 21h20.


 
 
 
 
Partenaires

Hébergement Web