2016-11-19 107 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,則它​​將不起作用 –