MySQL: 잘못된 그룹 함수 사용
MySQL을 사용하고 있습니다.스키마는 다음과 같습니다.
공급업체(sid: 정수, sname: 문자열, 주소 문자열)
부품(pid: 정수, pname: 문자열, 색상: 문자열)
카탈로그(sid: 정수, pid: 정수, 비용: 실제)
(프라이머리 키는 굵은 글씨로 표시)
적어도 2개의 공급업체가 만드는 모든 부품을 선택하기 위한 쿼리를 작성하려고 합니다.
-- 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)
첫 번째 오류는 사용 장소에 따라 발생하는 오류입니다.COUNTfunction -- aggregate(또는 group) 함수를 사용할 수 없습니다.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개는 있다sids. 1줄마다 1줄씩만 돌아가도록 한다.pid그룹화 조항을 적용했습니다.
where 구에 집약 함수가 없는 경우, 다른 소스일 수 있습니다.1111 - Invalid use of group functionerror는 집약함수가 중첩되어 있는 경우입니다.
select sum(avg(close)) from prices;
(1111, 'Invalid use of group function')
문제를 2단계로 나누어 회피할 수 있습니다.
- 내부 집계를 변수에 저장
select @avg:=avg(close) from prices;
- 변수에 대해 외부 집계를 실행합니다.
select sum(@avg) from prices;
언급URL : https://stackoverflow.com/questions/2330840/mysql-invalid-use-of-group-function
'programing' 카테고리의 다른 글
| Python 함수의 소스코드는 어떻게 얻을 수 있나요? (0) | 2022.12.10 |
|---|---|
| [ Information Schema COLUNS ]테이블의 컬럼 유형 (0) | 2022.12.10 |
| SQL 구문. 사용하는 올바른 구문은 MariaDB 서버 버전에 해당하는 매뉴얼을 참조하십시오. (0) | 2022.12.10 |
| 인터페이스가 다른 인터페이스를 구현할 수 없는 이유는 무엇입니까? (0) | 2022.12.10 |
| Mysql 직원 휴식 시간 기록(시간 차이 있음 (0) | 2022.12.10 |