2016-11-19 105 views
0

我有一个表中有一些用户在里面。他们都有一个用户名,纬度,经度和其他一些领域。SQL SELECT语句与HAVING和OR

我想选择给定坐标的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

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

编辑:

如果你想保证迈克和约翰是一个结果集,你可以这样做:

(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'); 
+0

是的,那是我正在做的,但是这不起作用。原因是我认为它只会选择活跃为0的用户(假设?为0),并且如果mike没有活跃为0,则它​​将不起作用 –