我有一张桌子,里面有一些用户。它们都有用户名,纬度,经度和其他一些字段。
我想根据一些其他标准选择给定坐标的5KM范围内的所有用户。现在这部分并不难。
但是,我还希望SQL语句独立于上面提到的其他标准返回给定用户名的用户。
所以,基本上,SQL应该根据距离以及具有特定用户名的其他标准和用户返回用户,尽管它们符合标准或不符合标准。
这是我所拥有的,但它不起作用:
SELECT idUser
, username
, telephone
, latitude
, longitude
, ( 6371 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS distance
FROM main
WHERE active = ?
AND idUser != ?
HAVING distance < 5
OR username = mike
OR username = john
答案 0 :(得分:0)
您可以将条件添加到having
子句:
SELECT idUser, username, telephone, latitude, longitude,
( 6371 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS distance
FROM main
WHERE active = ? AND idUser != ?
HAVING distance < 5 OR username IN ('mike', 'john');
您可能需要删除idUser
。 。 。我不确定这是否与username
有关。
编辑:
如果你想保证mike和john在结果集中,你可以这样做:
(SELECT idUser, username, telephone, latitude, longitude,
( 6371 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS distance
FROM main
WHERE active = ? AND idUser != ? AND username NOT IN ('mike', 'john')
HAVING distance < 5
)
UNION ALL
(SELECT idUser, username, telephone, latitude, longitude,
( 6371 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS distance
FROM main
WHERE username IN ('mike', 'john')
)
或者:
SELECT idUser, username, telephone, latitude, longitude,
( 6371 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS distance
FROM main
WHERE (active = ? AND idUser <> ?) OR username IN ('mike', 'john')
HAVING distance < 5 OR username IN ('mike', 'john');
或将所有条件移至HAVING
子句:
SELECT idUser, username, telephone, latitude, longitude,
( 6371 * acos( cos( radians(?) ) * cos( radians( latitude ) ) * cos( radians( longitude ) - radians(?) ) + sin( radians(?) ) * sin( radians( latitude ) ) ) ) AS distance
FROM main
WHERE (active = ? AND idUser <> ?) OR username IN ('mike', 'john')
HAVING (active = ? AND idUser <> ? AND distance < 5) OR
username IN ('mike', 'john');