2009-10-03 7 views
3

J'ai 3 tables: 1 contient des gens avec leur ville (vient d'une autre table) et la plage (int, 1-20) ils veulent être trouvés en (en miles) Ce que je suis en train de faire est de sélectionner les personnes en fonction d'un code postal quelqu'un entre. 1 Si ce code postal est pour une ville dans leur gamme, la personne doit être sélectionnée dans la base de données.sélectionner des résultats par code postal/longitude/latitude

i ont ce code php:

// Latitude calculation 
    $limit = (1/69.1703234283616) * $radius; 
    $latitude_min = $latitude - $limit; 
    $latitude_max = $latitude + $limit; 

    // Longitude calculation 
    $limit = (1/(69.1703234283616 * cos($userLat * (pi/180)))) * $radius; 
    $longitude_min = $longitude - $limit; 
    $longitude_max = $longitude + $limit; 

maintenant Heres la partie difficile. Je ne sais pas comment je vais sélectionner les gens de la DB, en fonction de ce code postal et leur portée.

Quelqu'un peut-il m'aider un peu ici?

+0

Fournissez-vous deux paramètres: code postal et plage? Puis trouver toutes les personnes dans les villes dans cette gamme? par exemple. Si vous saisissez le code postal AAA et range 2, alors trouvez toutes les personnes dans toutes les villes dans un rayon de 2 mile de AAA? Et la variable $ radius est-elle supérieure à = range? –

Répondre

3

Voici une fonction stockée pour MySQL que j'ai créée il y a un certain temps - elle renvoie la distance (approximative) entre deux paires de latitude et longitude en mètres.

DELIMITER $$ 

CREATE FUNCTION LAT_LNG_DISTANCE(lat1 FLOAT, lng1 FLOAT, lat2 FLOAT, lng2 FLOAT) RETURNS int(11) 
BEGIN 
    DECLARE latD FLOAT; 
    DECLARE lngD FLOAT; 
    DECLARE latS FLOAT; 
    DECLARE lngS FLOAT; 
    DECLARE a FLOAT; 
    DECLARE c FLOAT; 

    SET lat1 = RADIANS(lat1); 
    SET lng1 = RADIANS(lng1); 
    SET lat2 = RADIANS(lat2); 
    SET lng2 = RADIANS(lng2); 

    SET latD = lat2 - lat1; 
    SET lngD = lng2 - lng1; 

    SET latS = SIN(latD/2); 
    SET lngS = SIN(lngD/2); 

    SET a = POW(latS, 2) + COS(lat1) * COS(lat2) * POW(lngS, 2); 
    SET c = 2 * ASIN(LEAST(1, SQRT(a))); 

    RETURN ROUND(c * 6378137); 
END; 
$$ 
DELIMITER ; 

Maintenant, nous avons défini que, nous avons besoin d'obtenir l'origine de la recherche basée sur le code postal de l'utilisateur nous a donné. Comme je ne connais pas la structure exacte de votre base de données, j'utiliserai des jointures et des conditions génériques qui, je l'espère, seront assez similaires à la réalité pour que vous puissiez facilement l'adapter. Je vais utiliser $var pour impliquer le passage de PHP ; inutile de le dire, il faudra s'échapper d'une manière appropriée.

SELECT l.lat, l.lng 
FROM city_locations l 
INNER JOIN city_postcodes c 
ON l.city_id = c.city_id 
WHERE c.postcode = $postcode; 

Maintenant, nous pouvons passer les résultats de cette requête à la requête suivante, qui utilisera la fonction LAT_LNG_DISTANCE nous avons défini plus tôt.

SELECT * 
FROM people p 
INNER JOIN city_locations l 
ON p.city_id = l.city_id 
WHERE LAT_LNG_DISTANCE(l.lat, l.lng, $search_lat, $search_lng) < p.range * 1609; 

1609 est le nombre de mètres dans un mile, soit dit en passant. J'espère avoir bien compris la question!

+0

phpMyAdmin me donne ces erreurs en essayant d'exécuter le script de création de fonction: Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'DELIMITER' à la ligne 1 –

+0

Si vous exécutez la requête dans phpMyAdmin, supprimez les instructions 'DELIMITER' de la requête elle-même et définissez le champ délimiteur dans la boîte ci-dessous la requête. –

Questions connexes