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

PHP & Base de données Discussion :

Restreindre une requête


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut Restreindre une requête
    Bonjour à tous,

    Tout d'abord je ne suis pas bien sur que je poste dans le bon forum. Le forum sur le php en général aurait pu aussi être approprié, selon la réponse que j'aurais à ma question...

    Voici ma problématique :

    Je possède une base de donnée avec les infos personnelles de mes membres, dont la latitude et longitude. Sur une des pages de mon site, l'utilisateur est géolocalisé et j'ai donc dans des variables sa lat et lng actuelle.

    J'aimerai afficher un message du style "le membre le plus proche de votre localisation est : XXXXXX "

    Pour le moment je pense me passer de l'api matrix de google et me contenter de la distance a vol d'oiseau, qui est donc égal a :
    racine carré de [ (lat2-lat1)^2 + (lng2-lng1)^2) ]

    Je pourrais donc faire une requête qui récupère les lat et lng de tous les membres et ensuite les comparer aux coordonnées courantes de l'utilisateur, mais vue le nombre de membres (plusieurs milliers), j'imagine que cela risque d'être lent et donc j'aimerai trouver une autre solution.

    Il me faudrait une astuce qui me permettrait de faire directement une restriction (dans la requete PDO ?) mais je ne vois pas trop comment faire....

    Si quelqu'un a une idée, je suis preneur de toute piste à explorer !!

    Merci d'avance,
    Florian

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut
    Comme première idée, je pensais restreinte la requête aux entrées de la table dont la latitude est comprise entre (latitude_utilisateur - X) et (latitude_utilisateur + X) et la longitude comprise entre (longitude_utilisateur - Y) et (longitude_utilisateur + Y)....
    En déterminant un X et un Y qui permettent de chercher par exemple dans un carré de 100 ou 200km autour de l'utilisateur.

    Ce qui fonctionne bien si un membre au moins se trouve dans cette zone mais si l'utilisateur est isolé la recherche ne trouvera rien...
    C'est la la limite de cette solution qui ne me convient donc pas trop

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2008
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2008
    Messages : 64
    Par défaut
    En utilisant la clause LIMIT de mySql, ça devrait suffire.


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [FORMULE DISTANCE] AS 'distance' FROM table ORDER BY distance DESC LIMIT 1

    T'as plus qu'à adapter la requête (ajouter un 'WHERE distance < XXX' si tu veux limiter le rayon par exemple).

  4. #4
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    Pour faire un premier tri rapide je suggère plutôt
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [FORMULE DISTANCE PRECISE] AS 'distance' FROM TABLE HAVING [Formule distance grossière mais rapide]  < distance_a_définir ORDER BY distance DESC LIMIT 1

  5. #5
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Par défaut
    Je crois que restreinte la requête c'est la meilleur solution, puis tu dois soit suggéré au client d'agrandir la surface de recherche, soit tois tu aggrandi directement la surface si le résultat de la première requête est 0

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Citation Envoyé par Lazaa Voir le message
    Comme première idée, je pensais restreinte la requête aux entrées de la table dont la latitude est comprise entre (latitude_utilisateur - X) et (latitude_utilisateur + X) et la longitude comprise entre (longitude_utilisateur - Y) et (longitude_utilisateur + Y)....
    En déterminant un X et un Y qui permettent de chercher par exemple dans un carré de 100 ou 200km autour de l'utilisateur.

    Ce qui fonctionne bien si un membre au moins se trouve dans cette zone mais si l'utilisateur est isolé la recherche ne trouvera rien...
    C'est la la limite de cette solution qui ne me convient donc pas trop
    Au contraire, c'est une très bonne idée.
    C'est d'ailleurs souvent celle utilisée :
    -> "rechercher dans un rayon de 20km / 50km / ..."

    Comme l'explique m4riachi :
    1/ tu effectues en effet cette recherche.
    2/ SI résultat(s) => tu l(es) affiches
    SINON -> nouvelle recherche, en élargissant la distance (en augmentant la distance X)

    Et au lieu de dire :
    " LE membre le plus proche est ..."
    Tu peux dire :
    "LES membres les plus proches (ou situés dans un rayon de xxxkm) sont ..."

  7. #7
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut
    Super, merci pour vos réponses !
    Effectivement élargir la zone de recherche si pas de résultat, me semble pas mal

    Par contre j'ai un peu de mal avec la requête
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT [FORMULE DISTANCE] AS 'distance'
    Dans ma table, j'ai une colonne "lat" et une "lng". J'ai besoin de ces valeurs pour chacune des entrées de la table pour calculer la distance.

    Est-il possible d'écrire "lat" et "lng" directement dans ma requete afin que soit prisent en compte les valeurs de ces colonnes ? J'ai fait un test en remplacant FORMULE par lat + lng et ca fonctionne. Mais pas avec la vrai formule.

    En fait les opérateurs fonctionnent bien dans la requete mais pas les fonctions (racine carré et carré), si bien que si j'essai le code ci dessous, ca ne fonctionne pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $lat = 50.5; // Latitude de la position de l'utilisateur. Pour l'exemple 50.5
    $lng = 3.3; // Longitude de la position de l'utilisateur. Pour l'exemple 3.3
     
    $req = $bdd->prepare("SELECT". sqrt( pow((.'lat'. - $lat), 2) + pow((.'lat'.- $lng), 2) ). " AS 'distance', pseudo FROM membres ORDER BY distance DESC LIMIT 1");
    $req->execute(array());
    $data = $req->fetch();
     
    echo $data['pseudo'];

  8. #8
    Membre émérite Avatar de ypcman
    Homme Profil pro
    Retraité codeur !
    Inscrit en
    Janvier 2011
    Messages
    601
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité codeur !
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 601
    Par défaut
    Tu as mis 2 fois 'lat'.
    Par ailleurs, il faut ajouter un ABS pour gérer les différences de lat/long négatives.
    Enfin si tu tries en DESC, tu auras d'abord les plus grandes distances or je crois que tu cherche la plus petite distance

    Essaye donc plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $req = $bdd->prepare("SELECT SQRT( POW(ABS(lat - ".$lat."), 2) + POW(ABS(lng- ".$lng."), 2) ) AS 'distance', pseudo FROM membres ORDER BY distance LIMIT 1");

  9. #9
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2013
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 30
    Par défaut
    Super, merci
    Ca marche au top !

    Par contre je me suis un peu avancé en disant que j'avais 2 variables qui contiennent la latitude et longitude car elles sont en javascript... J'imagine donc qu'il faut que je passe par de l'ajax pour récupérer ces valeurs en php sans recharger la page, mais je ne connait pas ! Encore un peu de travail devant moi...



    Florian

Discussions similaires

  1. Utilisation de MAX dans une requête SQL
    Par Evil onE dans le forum Langage SQL
    Réponses: 7
    Dernier message: 15/06/2004, 18h38
  2. Problème sur une requête INSERT
    Par Marion dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/06/2003, 08h45
  3. problème sur une requête!!!!!
    Par Mcgrady_01 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/06/2003, 01h17
  4. Proposer le resultat d'une requête en téléchargement
    Par Lux interior dans le forum XMLRAD
    Réponses: 5
    Dernier message: 17/02/2003, 15h44
  5. [BDD] Enregistrer le résultat d'une requête
    Par Mowgly dans le forum C++Builder
    Réponses: 5
    Dernier message: 19/06/2002, 15h26

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