Sélectionner des enregistrements proches les uns des autres
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
-
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?
-
-
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.
-
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) { } -
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)
-
-