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
.
차이점은 WHERE
MySQL이 선택하는 행을 필터링하는 절입니다. 그런 다음 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
그룹화 절을 적용한 당 하나의 행만 반환되도록합니다 .