2016-11-19 2 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 или нет.

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), и если у mike нет активного 0, это не сработает –

Смежные вопросы