带有HAVING和OR的SQL SELECT语句

时间:2016-11-19 15:33:56

标签: mysql

我有一张桌子,里面有一些用户。它们都有用户名,纬度,经度和其他一些字段。

我想根据一些其他标准选择给定坐标的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

1 个答案:

答案 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');