Sélectionner des enregistrements proches les uns des autres

franksh Messages postés 54 Date d'inscription dimanche 8 juillet 2018 Statut Membre Dernière intervention 23 août 2024 - 5 juil. 2024 à 15:54
yg_be Messages postés 23239 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 octobre 2024 - 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 `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

A voir également:

1 réponse

yg_be Messages postés 23239 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 octobre 2024 Ambassadeur 1 540
5 juil. 2024 à 17:45

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 dimanche 8 juillet 2018 Statut Membre Dernière intervention 23 août 2024 1
5 juil. 2024 à 17:47

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

BETWEEN (YEAR(CURDATE())....
0
yg_be Messages postés 23239 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 octobre 2024 1 540 > franksh Messages postés 54 Date d'inscription dimanche 8 juillet 2018 Statut Membre Dernière intervention 23 août 2024
5 juil. 2024 à 18:56

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
franksh Messages postés 54 Date d'inscription dimanche 8 juillet 2018 Statut Membre Dernière intervention 23 août 2024 1 > yg_be Messages postés 23239 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 octobre 2024
Modifié le 5 juil. 2024 à 19:20

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
yg_be Messages postés 23239 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 octobre 2024 1 540 > franksh Messages postés 54 Date d'inscription dimanche 8 juillet 2018 Statut Membre Dernière intervention 23 août 2024
5 juil. 2024 à 20:21

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
franksh Messages postés 54 Date d'inscription dimanche 8 juillet 2018 Statut Membre Dernière intervention 23 août 2024 1 > yg_be Messages postés 23239 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 4 octobre 2024
5 juil. 2024 à 21:46

Toujours pas.

0