mysql - 带有 HAVING 和 OR 的 SQL SELECT 语句

标签 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

最佳答案

您可以将条件添加到 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/

相关文章:

java - 如何使用 Swing 正确处理大数据 - 性能提示

mysql - 格式化Sql查询数字以返回给定格式的数字

mysql - 带有 xampp + rails + mysql2 gem 的 OS X Lion

php - Mysql从每行的组中获取最大行和最小行

php - 发送批量请求

php - 根据用户投票列出热门项目

php mysql - 从多个表中选择所有行然后保存为对象数组 (json)

php - 似乎无法找到 SQL 语句出错的地方

mysql - 通过列描述中更改的变量值过滤选择的行

php - 为服务器子域/子文件夹上的不同 PHP 应用程序连接/组合 MySQL 数据库中的多个用户表