我有一个充满用户的数据库,大致如下所示:
| 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查询中没有很好地遍历,也不知道要采用哪种方式。
答案 0 :(得分: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