2012-01-06 3 views
0

J'ai une base de données complète des utilisateurs qui ressemble à peu près comme ceci:Comment combiner 2 requêtes SQL complexes en 1

| id | username | birthdate | sex | zip_code | latitude | longitude | 
|----+----------+------------+-----+----------|-----------+------------| 
| 1 | userA | 1986-04-05 | M | 90210 | 34.088808 | -118.40612 | 
| 2 | userB | 1984-08-15 | F | 10011 | 40.741012 | -74.00012 | 
| 3 | userC | 1984-11-25 | F | 10014 | 40.734718 | -74.00532 | 

J'ai cherché sur internet et a trouvé 2 requêtes très utiles qui me permettent de calculer la distance et l'âge d'un utilisateur particulier. Voici la requête de loin, je suis venu avec:

SELECT username, (
(
ACOS(SIN($latitude * PI() /180) * SIN(latitude * PI() /180) + COS($latitude * PI() /180) * COS(latitude * PI() /180) * COS((
$longitude - longitude 
) * PI() /180)) *180/PI() 
) *60 * 1.1515 
) AS `distance` 
FROM `userList` 
HAVING `distance` <=15 
ORDER BY `distance` ASC 
LIMIT 0 , 30 

Cela me donne un résultat de tous les utilisateurs dans ma base de données qui est situé à 15 miles ou moins de moi. Voici la requête d'âge:

SELECT username, YEAR(CURDATE()) - YEAR(birthdate) - IF(STR_TO_DATE(CONCAT(YEAR(CURDATE()) , '-', MONTH(birthdate) , '-', IF(MONTH(birthdate) =2 
AND DAY(birthdate) =29, DAY(DATE_ADD(CONCAT(YEAR(CURDATE()) , '-03-01') , INTERVAL -1 
DAY)) , DAY(birthdate))) , '%Y-%c-%e') > CURDATE() , 1, 0) AS age 
FROM userList 
LIMIT 0 , 30 

Ce que je voudrais faire est de combiner ces requêtes de telle manière où un utilisateur peut rechercher d'autres utilisateurs qui sont situés à moins de miles X loin et plus que Y, mais plus jeune alors Z

Comment puis-je combiner ces requêtes en une seule? Je ne suis pas très bien parcouru dans les requêtes SQL et je ne sais pas comment procéder.

Répondre

2
Select 
    username, 
    (age_stuff) as age, 
    (distance_stuff) as distance 
from userList 
where 
    distance < 15 
    and age < 24 and age > 64 
order by distance 
limit 30 
+0

ne comprenait pas Lieven's Post non plus. Tout faire une fois semble plus intelligent. @Xecure vous pourriez envisager de ne pas calculer l'âge chaque fois que vous sélectionnez quelque chose. En cas de charge lourde et lourde, cela pourrait poser problème. – Harry

+0

@Harry Bien que toutes les recherches demandées par un utilisateur aient un champ ageMin et ageMax, je prévoyais de supprimer le calcul d'âge si le champ ageMin était le plus bas possible et ageMax le plus élevé possible. Je ne vois pas d'autre moyen de contourner cela. – Xecure