2012-01-06 54 views
0

我有一个完整的用户数据库,大约是这样的:如何合并2个复杂的SQL查询到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 | 

我已经在网上搜索,发现2次非常有用的查询,让我计算出的距离和特定用户的年龄。这里是距离查询我想出了:

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 

这让我在我的数据库位于15英里少从我的用户的结果。这里是年龄查询:

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 

我想什么做的是这样一种方式,其中用户可以搜索位于小于X英里远,年长于Y但年轻然后其他用户将这些查询Z

我该如何将这些查询合并为一个?我在SQL查询中不是很好遍历,也不知道要继续。

回答

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

不理解列文的邮报。这样做一次似乎更聪明。 @Xecure你可能会认为每次选择某个东西时都不会计算年龄。如果重负荷过重,这可能是一个问题。 – Harry 2012-01-06 08:42:51

+0

@Harry尽管用户请求的所有搜索都会有ageMin和ageMax字段,但我计划在ageMin字段最低并且ageMax最高时计算年龄。我没有看到任何其他方式。 – Xecure 2012-01-06 17:59:31