2013-05-05 7 views
0

문제는 다음과 같습니다. IP 주소를 그룹화하고 리턴 코드 (retcode)가 300보다 큰 각 IP 주소별로 요청 수를 표시하는 질의 작성 이 쿼리는 내림차순으로 retcode 필드로 표시됩니다. 내가 함께 왔어요 무엇제어 흐름 함수 내에서 집계 사용

이이 질문에 대답하지 않습니다 물론

SELECT ipno, retcode, IF(retcode > 300, 1, 0) AS 'return' 
FROM WebLog 
GROUP BY ipno 
HAVING SUM(retcode) > 300 
ORDER BY retcode DESC 

(그것으로 어려움을 겪고 많은 시간 후), 난 그냥 솔루션의 부족 해요입니다. 같은

는 IF 또는 CASE 문에서 집계 함수를 사용하는 방법은 없나요 :

IF(retcode > 300, SUM retcode, 0) 

는 내가 제대로 쿼리를 작성하는 방법을 알고 있다면이 작동 할 것이라는 점을 생각한다.

답변

0

실제로 문제는 타당하지 않습니다. 한 캔 그룹 다음 쿼리와 같이 IP 주소에 & 수, 그러나

SELECT ipno, COUNT(*) 
FROM  Weblog 
WHERE retcode > 300 
GROUP BY ipno 

는 특정 IP에서하지만 다른 리턴 코드 (350 및 400 말) 두 개의 요청이 있다고 가정; 위의 쿼리는 그 주소에 대해 2의 카운트를 보여줄 것입니다.하지만 결과가 그룹화되었으므로 반환 코드로 결과를 정렬한다는 것은 현재 그 하나의 IP 주소에 대한 단일 코드가 존재하지 않는다는 것을 의미합니까?

MySQL은 집계 함수를 포함하지 않고 위의 쿼리에서 "hidden"열 (예 : retcode)에 액세스 할 수 있다는 점에서 예외적입니다. 다른 RDBMS는 귀하가 귀하의 질문에서 귀하가 제공 한 질의에 오류를 제기합니다. 그러나 성능상의 이유로 MySQL은 숨겨진 열에 대해 각 그룹의 값 중에서 불확정 값을 선택하므로 모두 같지 않으면 결과에 의존해서는 안됩니다.

은 아마 당신은 ipnoretcode에 그룹화 할 :

SELECT ipno, retcode, COUNT(*) 
FROM  Weblog 
WHERE retcode > 300 
GROUP BY ipno, retcode 
ORDER BY retcode DESC