2011-07-29 3 views
0

동일한 결과를 반환 할 때 다른 결과를 반환하는 두 개의 쿼리가 있습니다.MySQL`HAVING` 문제

첫 번째 쿼리는 올바른 결과를 반환합니다. 두 번째는 결과를 반환하지만 올바르지 않습니다.

이유는 무엇이며 어떻게 두 번째 명령문을 수정하여 동일한 결과를 얻을 수 있습니까? 이 문장에서 HAVING 절을 사용해야합니다. 당신이 제공 할 수있는 모든 도움에 미리

2.

SELECT 
     CAST(CONCAT(DATE(`mytable`.`starttime`),' ',HOUR(`mytable`.`starttime`),':',LPAD(60*(MINUTE(`mytable`.`starttime`) DIV 60),2,'0'),':00') AS DATETIME) AS `date`, 
     `mytable`.`id` 
    FROM 
     `mytable` 
    WHERE 
     `mytable`.`starttime`>='2011-07-01 00:00:00' 
     AND `mytable`.`starttime`<='2011-07-01 23:59:59' 
     AND `id` BETWEEN 1 AND 100 
    GROUP BY 
     `mytable`.`id` 

1.

SELECT 
     CAST(CONCAT(DATE(`mytable`.`starttime`),' ',HOUR(`mytable`.`starttime`),':',LPAD(60*(MINUTE(`mytable`.`starttime`) DIV 60),2,'0'),':00') AS DATETIME) AS `date`, 
     `mytable`.`id` 
     FROM 
     `mytable` 
    WHERE 
     `id` BETWEEN 1 AND 100 
    GROUP BY 
     `mytable`.`id` 
    HAVING `date` IN ('2011-07-01 00:00:00', '2011-07-01 01:00:00', '2011-07-01 02:00:00', '2011-07-01 03:00:00', '2011-07-01 04:00:00', '2011-07-01 05:00:00', '2011-07-01 06:00:00', '2011-07-01 07:00:00', '2011-07-01 08:00:00', '2011-07-01 09:00:00', '2011-07-01 10:00:00', '2011-07-01 11:00:00', '2011-07-01 12:00:00', '2011-07-01 13:00:00', '2011-07-01 14:00:00', '2011-07-01 15:00:00', '2011-07-01 16:00:00', '2011-07-01 17:00:00', '2011-07-01 18:00:00', '2011-07-01 19:00:00', '2011-07-01 20:00:00', '2011-07-01 21:00:00', '2011-07-01 22:00:00', '2011-07-01 23:00:00') 

감사합니다.

+0

은 적은 결과를주는 두 번째 쿼리입니다 (따라서 잘못된 것입니다 ..). 결과 집합을 줄이는 데 사용할 수있는 날짜 조건의 특정 시간을 지정했습니다. –

답변

0

는 후 인가되는 데. 따라서 WHERE 절이없는 GROUP BY가있는 두 번째 쿼리에서 MySql은 임의의 (결정되지 않은) 단일 행을 반환 한 다음 HAVING 절을 적용합니다.

+0

사과, 위의 예제에서 나는 동일한 모든 것을 제거하고 문제로 배제 할 수 있지만 너무 많이 제거했습니다. 완전성을 위해 두 번째 쿼리에 where 절을 추가했습니다. 실제 세계에서는 한 줄에 6 개의 결과 집합을 반환하는 200 줄 UNION 쿼리의 일부입니다. – Hadleigh

+0

현재 쿼리를 보면 첫 번째 쿼리는 id 당 한 행을 반환하고 두 번 주어진 시간 사이에 * starttime *을 반환하며 두 번째 쿼리는 id 당 하나의 미정의 (임의의) 행을 반환 한 다음 * starttime *이 지정된 시간과 if 사이에 있는지 확인합니다 결과에서 제외하지 않습니다. 이 두 가지는 완전히 다른 결과를 낳습니다. – nobody

+0

죄송합니다. 나는 두껍습니다. 추가 설명을 주셔서 감사합니다. 이제 완벽하게 이해할 수 있습니다. – Hadleigh

0

Group by는 집계 함수 (sum, min, max, count)와 함께 사용됩니다. 검색어에 '선택'항목에 집계가없는 것으로 표시되어 그룹별로 아무 것도하지 않습니다.

검색어가 유효한 SQL 일 수도 있지만 의미가 없습니다. 비록 이것이 왜 당신의 결핍 조항이 열매없는 것인지 확실하지 않습니다.

+0

이 경우 Group by는 많은 IDS가 1로 줄어들도록 보장하므로 날짜 범위 내에서 고유 한 IDS 수를 얻을 수 있습니다. – Hadleigh

+0

시간이 1 인 경우 ID를 고유하게 계산하지만 시간이 2 인 경우 다시 고유하지는 않습니다. 몇 번이나 발생했는지에 관계없이 한 번만 기록하려고합니다. – Hadleigh

+0

쿼리 2에서 확인한 문제는 합법적 인 고유 ID가 기록되지 않고 있다는 것입니다. 따라서 u 리 1이 16:00에서 17:00 사이에 1 id를 찾을 수있는 경우, u 리 2는 그렇지 않습니다. – Hadleigh

0

"id"가 테이블의 기본 키라고 가정합니다. 맞습니까? 나는 다양한 이벤트가 발생한 그날의 시간을 보여주고 싶다고 생각하지만 왜 ID로 그룹화하는지 확신 할 수 없습니다. 출력물을 어떻게 보이게 할 것인지 예를 들어 주시겠습니까? 절 동안 그룹화 전에 인가된다

+0

ID가 기본 키가 아니며 많은 ID가있을 수 있습니다. 이것은 더 큰 질의의 일부이지만 본질적으로 고유 한 ID를 처음 발견 할 때 +1을 계산해야합니다. 그런 다음 그 값을 할인하십시오. – Hadleigh