MySQL : 그룹 함수의 잘못된 사용


104

MySQL을 사용하고 있습니다. 내 스키마는 다음과 같습니다.

공급자 ( sid : 정수 , 이름 : 문자열, 주소 문자열)

부품 ( pid : 정수 , pname : 문자열, 색상 : 문자열)

카탈로그 ( sid : 정수, pid : 정수 , 비용 : 실수)

(기본 키는 굵게 표시됨)

최소한 두 공급 업체에서 만든 모든 부품을 선택하는 쿼리를 작성하려고합니다.

-- Find the pids of parts supplied by at least two different suppliers.
SELECT c1.pid                      -- select the pid
FROM Catalog AS c1                 -- from the Catalog table
WHERE c1.pid IN (                  -- where that pid is in the set:
    SELECT c2.pid                  -- of pids
    FROM Catalog AS c2             -- from catalog
    WHERE c2.pid = c1.pid AND COUNT(c2.sid) >= 2 -- where there are at least two corresponding sids
);

우선,이 일에 대해 올바른 방향으로 가고 있습니까?

둘째,이 오류가 발생합니다.

1111-그룹 기능의 유효하지 않은 사용

내가 뭘 잘못하고 있죠?

답변:


173

당신은 사용할 필요 HAVING하지 WHERE.

차이점은 WHEREMySQL이 선택하는 행을 필터링하는 절입니다. 그런 다음 MySQL은 행을 함께 그룹화하고 COUNT함수 의 숫자를 집계합니다 .

HAVING처럼 WHERE만 발생, COUNT 값이 계산 된 예상대로 작동거야, 그래서. 하위 쿼리를 다음과 같이 다시 작성하십시오.

(                  -- where that pid is in the set:
SELECT c2.pid                  -- of pids
FROM Catalog AS c2             -- from catalog
WHERE c2.pid = c1.pid
HAVING COUNT(c2.sid) >= 2)

25
GROUP BY를 사용하는 경우 또한, HAVING GROUP BY 후해야
비아체슬라프

1
또한, GROUP BY는 Bandolero의 코멘트를 읽고해야 .... HAVING 전에 할 필요가 : D
앤드류

8

첫째, 오류가 발생하는 이유는 COUNT함수를 사용하는 위치로 인한 것 WHERE입니다. 절 에서 집계 (또는 그룹) 함수를 사용할 수 없습니다 .

둘째, 하위 쿼리를 사용하는 대신 테이블을 자신에 조인하면됩니다.

SELECT a.pid 
FROM Catalog as a LEFT JOIN Catalog as b USING( pid )
WHERE a.sid != b.sid
GROUP BY a.pid

적어도 두 개의 행이 동일 pid하지만 적어도 2 개의 행이있는 행만 반환해야한다고 생각합니다 sid. pid그룹화 절을 적용한 당 하나의 행만 반환되도록합니다 .


조인이 필요하지 않을 수 있습니까? (가능한 솔루션을 제공 한 업데이트 된 답변 참조)
Nick Heiner

@Rosarch, COUNT(DISTINCT sid)업데이트 된 쿼리 에 사용하고 싶을 것 입니다.
Mark Elliot

그리고 함께 기본 키를 형성 sid하기 때문에 어쨌든 항상 구별 될 필요는 없습니다. ? sidpidCatalog
Nick Heiner
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.