Запрос с HAVING и ГДЕ - PullRequest
       32

Запрос с HAVING и ГДЕ

3 голосов
/ 10 января 2011

Я пытаюсь создать один запрос, который объединит следующие два запроса.

SELECT 
  campgroundid, 
  ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
    cos( radians( lng ) - radians(-122) ) + 
    sin( radians(37) ) * sin( radians( lat ) ) ) ) 
  AS distance 
FROM campground 
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;

SELECT * FROM campground WHERE type='private' AND wifi = 1

Я попытался поместить их в IN, но он вернул синтаксическую ошибку, которую я не мог понять, как исправить. Я попытался просто удалить HAVING и объединить запросы, но потом он говорит, что не может понять, что такое distance. Любая помощь приветствуется. Спасибо.

ВЫХОД: [campgroundid, имя, тип, Wi-Fi, расстояние] [1, лагерь ABC, частный, 1, 1,34 мили] [2, лагерь XYZ, частный, 1, 4,44 мили]

Ответы [ 5 ]

3 голосов
/ 10 января 2011

Среди не предоставленной информации есть связь между таблицами кемпингов и маркеров. Нам понадобится эта информация, чтобы знать, как присоединиться к таблицам.

Кроме того, для HAVING требуется GROUP BY (он работает как предложение WHERE для агрегированных результатов GROUP BY). Если вы не агрегируете строки в маркерах, вам нужно ГДЕ, а не HAVING.

В предположении, вы хотите что-то вроде этого:

 SELECT id (expression) as distance FROM markers
      WHERE distance < 25 AND 
        campground_id IN (SELECT id FROM campgrounds WHERE type = 'private' AND wifi = 1)

РЕДАКТИРОВАТЬ: Отражение новой информации, что есть только одна таблица.

Вы не можете использовать столбцы ALIAS в предложении WHERE. Я предполагаю, что вы это знаете, а также знаете, что вы можете использовать их в HAVING, поэтому вы пытаетесь заменить HAVING вместо WHERE. Для этого вам нужно переписать запрос GROUP BY:

SELECT campgroundid, name, private, wifi, 
   ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * 
    cos( radians( lng ) - radians(-122) ) + 
    sin( radians(37) ) * sin( radians( lat ) ) ) ) 
    AS distance 
FROM campground 
GROUP BY campgroundid 
HAVING distance < 25 AND type='private' AND wifi = 1
ORDER BY distance LIMIT 0 , 20;

Это будет работать до тех пор, пока campgroundid является уникальным (поскольку другие значения будут получены из единственной записи для этого идентификатора).

0 голосов
/ 17 февраля 2014

ВЫБРАТЬ campgroundid, (3959 * acos (cos (радианы (37)) * cos (радианы (широта)) * cos (радианы (lng) - радианы (-122)) + грех (радианы (37)) * грех (радианы (лат)))) AS расстояние ИЗ кемпинга ГДЕ type = 'private' И wifi = 1 ЗАКАЗАТЬ ПО ПРЕДЕЛУ ПРЕДЕЛОМ 0, 20 ИСПОЛЬЗУЯ расстояние <25 </p>

это может сработать

0 голосов
/ 04 декабря 2012

Если ваш вопрос состоит в том, чтобы иметь предложение WHERE из двух таблиц с логикой JOIN. Затем вы должны включить это значение в список SELECT. Например, ВЫБЕРИТЕ USER.UserName, USER.UserId, LOC.id, LOC.lat, LOC.lon, (3959 * acos (cos (радианы ('123.1210022')) * * cos (радианы (широта)) * cos (радианы (долгота)) - радианы ('21 .200001')) + sin (радианы ('123.1210022')) * * sin (радианы (широта)))) AS расстояние FROM userlocation LOC, пользователь USER HAVING distance <'1' AND LOC.id = USER.UserId ЗАКАЗАТЬ ПО ДИАПАЗОНУ LIMIT 0, 20 </p>

Если вы пропустите USER.UserId в списке выбора, вы не сможете LOC.id = USER.UserId в предложении WHERE.

0 голосов
/ 10 января 2011

Полагаю, стоит попробовать (так же просто, как добавить предложение where из второго sql в first)

SELECT 
  ... AS distance 
FROM campground 
WHERE type='private' AND wifi = 1
HAVING distance < 25 
ORDER BY distance LIMIT 0 , 20;
0 голосов
/ 10 января 2011

Похоже, это должно быть WHERE distance < 25, так как HAVING для запросов, таких как HAVING MAX(distance) < 25 и других агрегатных функций.

...