2016-11-19 7 views
0

私はテーブルをいくつか持っています。それらはすべてユーザー名、緯度、経度、その他のフィールドを持っています。HAVINGおよびORを使用したSQL SELECTステートメント

私は、指定された座標の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に関連しているかどうかはわかりません。

EDIT:

あなたはマイクとジョンは、結果セットにあることを保証したい場合は、あなたが行うことができます:

(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としてアクティブでない場合、それは動作しません –

関連する問題