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查询中不是很好遍历,也不知道要继续。
不理解列文的邮报。这样做一次似乎更聪明。 @Xecure你可能会认为每次选择某个东西时都不会计算年龄。如果重负荷过重,这可能是一个问题。 – Harry 2012-01-06 08:42:51
@Harry尽管用户请求的所有搜索都会有ageMin和ageMax字段,但我计划在ageMin字段最低并且ageMax最高时计算年龄。我没有看到任何其他方式。 – Xecure 2012-01-06 17:59:31