Sélectionner des enregistrements proches les uns des autres

franksh Messages postés 54 Date d'inscription   Statut Membre Dernière intervention   -  
yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention   - 6 juil. 2024 à 17:00

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 `s`
      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

A voir également:

1 réponse

yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention    

bonjour,

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

0
franksh Messages postés 54 Date d'inscription   Statut Membre Dernière intervention   1
 

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

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

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 `s`
      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
franksh Messages postés 54 Date d'inscription   Statut Membre Dernière intervention   1 > yg_be Messages postés 23538 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 `s`
      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
yg_be Messages postés 23538 Date d'inscription   Statut Contributeur Dernière intervention   1 583 > franksh Messages postés 54 Date d'inscription   Statut Membre Dernière intervention  
 

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 s?  Et les parenthèses sont-elles bien placées?

Peut-être plutôt:

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

Toujours pas.

0