Sélectionner des enregistrements proches les uns des autres

franksh Messages postés 54 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -

Bonjour,

J'essaie d'exécuter une requête basée sur ce qui est indiqué dans le titre, de sélectionner des enregistrements proches les uns des autres, avec entre deux dates de naissance, sans succès

jusqu'à présent, j'ai essayé cela en regardant de gauche à droite, ce que je veux, c'est renvoyer uniquement les utilisateurs qui se trouvent entre les dates que l'utilisateur actuel aura envoyées par method post, et entre la distance défini. 

if (!function_exists('Dot_Distance')) {
    function Dot_Distance($lat_u, $long_u, $or, $sex, $age, $age_tow, $age_olders, $uid, $distance){
      global $db;
      $latitude = $lat_u;
      $longitude = $long_u;
      $distance = $distance;
      $sagea = 'AND ('.$age_olders.' BETWEEN (YEAR(CURDATE())- ' . $age . ')  AND (YEAR(CURDATE())-' . $age_tow . '))';

$query = $db->prepare("SELECT *,  (((acos(sin(( $latitude * pi() / 180)) *sin(( `lat_` * pi() / 180)) +
      cos(( $latitude * pi() /180 ))*cos(( `lat_` * pi() / 180)) * cos((( $longitude - `long_`) *
      pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) as distance
      FROM `users`
      WHERE
      lat_ IS NOT NULL AND
      long_ IS NOT NULL
      AND
      orientation = '$or'
      AND sex = '$sex'
      $sagea // return 2008-07-05 / 2011-07-05
      AND id <> '$uid'
      HAVING distance < '$distance'
      ORDER BY distance * 1 ASC");

      $query->execute();

      $query = $query->fetchAll(PDO::FETCH_OBJ);

      // var_dump($sagea);
      return $query;


}
}


Windows / Chrome 126.0.0.0

Merci d'avance

1 réponse

  1. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   Ambassadeur 1 588
     

    bonjour,

    "sans succès": le calcul de la distance est-il correct?  cela donne quoi si tu retires la clause HAVING?

    0
    1. franksh Messages postés 54 Statut Membre 1
       

      Le calcul et correct je crois que le problème viens au niveau du date 

      BETWEEN (YEAR(CURDATE())....
      0
    2. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > franksh Messages postés 54 Statut Membre
       

      Je serais curieux de voir ce que donne ceci:

      $sql="SELECT *,  (((acos(sin(( $latitude * pi() / 180)) *sin(( `lat_` * pi() / 180)) +
            cos(( $latitude * pi() /180 ))*cos(( `lat_` * pi() / 180)) * cos((( $longitude - `long_`) *
            pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) as distance
            FROM `users`
            WHERE
            lat_ IS NOT NULL AND
            long_ IS NOT NULL
            AND
            orientation = '$or'
            AND sex = '$sex'
            $sagea // return 2008-07-05 / 2011-07-05
            AND id <> '$uid'
            HAVING distance < '$distance'
            ORDER BY distance * 1 ASC";
      var_dump($sql);
      $query = $db->prepare($sql);

      Le test à propos de l'âge est bizarre, on dirait qu'il ne va pas chercher l'âge dans la base de données.

      0
    3. franksh Messages postés 54 Statut Membre 1 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       

      ceci return un array(0) { } avec l'âge, mais sans l'âge je récupère bien des données 

      
              object(PDOStatement)#4 (1) {
        ["queryString"]=>
        string(605) "SELECT id,lat_,long_,  (((acos(sin(( 47.55314000 * pi() / 180)) *sin(( `lat_` * pi() / 180)) +
            cos(( 47.55314000 * pi() /180 ))*cos(( `lat_` * pi() / 180)) * cos((( -1.53200000 - `long_`) *
            pi()/180)))) * 180/pi()) * 60 * 1.1515 * 1.609344) as distance
            FROM `users`
            WHERE
            lat_ IS NOT NULL AND
            long_ IS NOT NULL
            AND
            orientation = 'Hétérosexuel'
            AND sex = 'Fille'
            AND (2002 BETWEEN (YEAR(CURDATE())- 2011-07-05)  AND (YEAR(CURDATE())-1998-07-05))
            AND id <> '33'
            -- HAVING distance < '500'
            ORDER BY distance * 1 ASC"
      }
      array(0) {
      }
      0
    4. yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   1 588 > franksh Messages postés 54 Statut Membre
       

      Quel sens cela a-t-il de faire ce test:

      (2002 BETWEEN (YEAR(CURDATE())- 2011-07-05) AND (YEAR(CURDATE())-1998-07-05))

      Ne serait-il pas plus logique d'avoir, au lieu de 2002, le nom du champ âge dans la table users?  Et les parenthèses sont-elles bien placées?

      Peut-être plutôt:

       users.Age BETWEEN YEAR(CURDATE()- 2011-07-05) AND YEAR(CURDATE()-1998-07-05)
      0
    5. franksh Messages postés 54 Statut Membre 1 > yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention  
       

      Toujours pas.

      0