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

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-그룹 기능의 유효하지 않은 사용

내가 뭘 잘못하고 있죠?



답변

당신은 사용할 필요 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)


답변

첫째, 오류가 발생하는 이유는 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그룹화 절을 적용한 당 하나의 행만 반환되도록합니다 .


답변