我有一个表,其中有一些用户。它们都有用户名、纬度、经度和其他一些字段。
我想根据一些其他标准选择给定坐标 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
最佳答案
您可以将条件添加到 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
。 。 。我不确定这是否与用户名
有关。
编辑:
如果你想保证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');
关于mysql - 带有 HAVING 和 OR 的 SQL SELECT 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40694647/