Bonjour,
Pour un de mes projets je rencontre régulièrement un problème pour établir des requêtes.
J'ai plusieurs tables :
event : (id, date, ..., id_lieu)
lieu : (id, nom, ..., id_ville)
villes : (id, ville, cp, slug, latitude, longitude, ..., id_dept)
departement : (id, nom, code, slug, ..., id_region)
region : (id, nom, slug, ...)
Et une procédure 'get_distance_metres' qui retourne la distance entre deux coordonnées :
Voila j'aimerais via une requête retourner toutes les villes ayant dans un rayon de 30km des events
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 BEGIN DECLARE rlo1 DOUBLE; DECLARE rla1 DOUBLE; DECLARE rlo2 DOUBLE; DECLARE rla2 DOUBLE; DECLARE dlo DOUBLE; DECLARE dla DOUBLE; DECLARE a DOUBLE; SET rlo1 = RADIANS(lng1); SET rla1 = RADIANS(lat1); SET rlo2 = RADIANS(lng2); SET rla2 = RADIANS(lat2); SET dlo = (rlo2 - rlo1) / 2; SET dla = (rla2 - rla1) / 2; SET a = SIN(dla) * SIN(dla) + COS(rla1) * COS(rla2) * SIN(dlo) * SIN(dlo); RETURN (6378137 * 2 * ATAN2(SQRT(a), SQRT(1 - a))); END
J'ai essayé avec les events puis joindre les villes via LEFT JOIN mais la requête avec les ~33k de villes n'en finit pas ...
ex :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 SELECT E.id as event_id, D.slug AS slug_dept, R.slug AS slug_region, V.slug_ville, V.CP FROM event E INNER JOIN lieu L ON L.id = E.id_lieu INNER JOIN villes V ON V.id = L.id_ville INNER JOIN departement D ON D.id = V.id_dept INNER JOIN region R on R.id = D.id_region INNER JOIN villes V2 ON get_distance_metres(V2.Latitude, V2.Longitude, V.Latitude, V.Longitude) < 30000 WHERE E.date > CURDATE() GROUP BY V.slug
Partager