programing

MySQL: 잘못된 그룹 함수 사용

goodjava 2022. 12. 10. 10:49

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단계로 나누어 회피할 수 있습니다.

  1. 내부 집계를 변수에 저장
select @avg:=avg(close) from prices;
  1. 변수에 대해 외부 집계를 실행합니다.
select sum(@avg) from prices;

언급URL : https://stackoverflow.com/questions/2330840/mysql-invalid-use-of-group-function