2015-07-02 1 views
2

Первые два запроса работают нормально, третий работает, но ничего не возвращает, когда должны быть результаты. Как я могу получить третий, чтобы вернуть результаты. Мне кажется, GROUP BY и HAVING не работают вместе.Как использовать GROUP By и HAVING в MySQL

2-й запрос возвращает 32 активных состояния и 7 ожидающих статуса, поэтому третий запрос должен возвращать резюме второго запроса, но это не так.

SELECT COUNT(DISTINCT MLSNumber) AS TOTAL, `Status` 
FROM Residential 
WHERE PropertyType='Single Family' AND Status IN ("Active", "Pending") 
GROUP BY `Status`; 

SELECT MLSNumber, `Status`, 
(3959 * acos(cos(radians(21.380936)) * cos(radians(Latitude)) 
* cos(radians(Longitude) - radians(-157.757438)) + sin(radians(21.380936)) 
* sin(radians(Latitude)))) AS distance 
FROM Residential 
WHERE PropertyType='Single Family' AND Status IN ("Active", "Pending") 
HAVING distance < 2; 

SELECT COUNT(DISTINCT MLSNumber) AS TOTAL, `Status`, 
(3959 * acos(cos(radians(21.380936)) * cos(radians(Latitude)) 
* cos(radians(Longitude) - radians(-157.757438)) + sin(radians(21.380936)) 
* sin(radians(Latitude)))) AS distance 
FROM Residential 
WHERE PropertyType='Single Family' AND Status IN ("Active", "Pending") 
GROUP BY `Status` 
HAVING distance < 2; 
+0

Второй должен использоваться 'WHERE'. 'HAVING' используется только для агрегации. – AdamMc331

ответ

2

Когда вы используете GROUP BY, вам необходимо использовать агрегированные функции для всех полей, не включенных в предложение GROUP BY.

Я думаю, что вы хотите, чтобы рассчитанное расстояние было частью вашего предложения where и избавилось от предложения HAVING.

WHERE PropertyType='Single Family' AND Status IN ("Active", "Pending") 
    AND (3959 * acos(cos(radians(21.380936)) * cos(radians(Latitude)) * cos(radians(Longitude) - radians(-157.757438)) + sin(radians(21.380936)) * sin(radians(Latitude)))) < 2 
0

Вы не можете использовать HAVING в этом примере, как это положение используется для specifying conditions on aggregate columns.

В вашем примере расстояние не является агрегированным столбцом, а вычисляется для каждой строки, поэтому, если вы хотите искать строки с расстоянием менее двух, вы должны использовать предложение WHERE. Тем не менее, я не уверен, что вы хотите группировать в этом случае, поскольку расстояние похоже на отдельные строки, а не на группу.

Единственная колонка в этих примерах, которая будет принадлежать HAVING, является вашей функцией подсчета.

0

Я предполагаю, что цель № 3 заключается в том, чтобы найти общее количество записей MLS в пределах 2 миль.

Проблема, с которой вы сталкиваетесь, заключается в том, что, группируя по Status в последнем запросе, вы применяете это сначала, прежде чем выполнять вычисления по широте и долготе. Таким образом, для каждой группы рассчитывается только одна широта и долгота.

Try обертывание запросов # 2 внутри другого выбора, что группы по статусу:

SELECT COUNT(DISTINCT i.MLSNumber) AS TOTAL, i.Status FROM 
    (SELECT MLSNumber, `Status`, 
     (3959 * acos(cos(radians(21.380936)) * cos(radians(Latitude)) * cos(radians(Longitude) - radians(-157.757438)) + sin(radians(21.380936)) * sin(radians(Latitude)))) AS distance 
    FROM Residential 
    WHERE PropertyType='Single Family' AND Status IN ("Active", "Pending") 
    HAVING distance < 2) as i Group by Status 

Вы, возможно, потребуется настроить в запросе немного, но это суть - я не Схему экспериментировать.

Кроме того, как отмечается в комментарии к предыдущей публикации, вы можете вырезать HAVING и просто использовать то место, где вы не группируете.