source

MariaDB는 그룹화 시 SELECT 문의 기능 의존성을 지원하지 않습니까?

factcode 2022. 10. 23. 09:57
반응형

MariaDB는 그룹화 시 SELECT 문의 기능 의존성을 지원하지 않습니까?

SQL 문에서 GROUP BY에 몇 가지 문제가 있습니다.

나는 마리아를 이용하고 있다.DB 10.1.17이며 SQL 문을 실행할 때 다음과 같은 오류가 발생합니다.

SELECT `pubs`.`ID` AS `ID`
    ,AVG(`reviews`.`atmosphere`) AS `average`
    ,`pubs`.`name` AS `name`
    ,`pubs`.`country` AS `country`
FROM `pubs`
LEFT JOIN `reviews` ON `pubs`.`ID` = `reviews`.`pub_ID`
GROUP BY `pubs`.`ID`
ORDER BY `average` DESC
    ,`reviews`.`date` DESC

내가 받는 오류는

구문 오류 또는 액세스 위반: 1055 'pubreviews.pubs.name'이 GROUP BY에 없습니다.

하나의 ID가 하나의 이름과 국가에 매핑된다는 '기능 의존관계' 때문에 이러한 컬럼을 명시적으로 그룹에 추가할 필요가 없다는 것이 나의 이해였다.

(나에게는ONLY_FULL_GROUP_BY켜짐)

이는 여기서 MySQL 5.7.5를 암시하는 것으로 보입니다.

이 에러 메세지가 표시됩니다.mariaDB는 이 기능을 구현하지 않습니까?

감사해요.

mariadb 문서에 따르면 다음과 같은 경우 기능 의존성을 고려하지 않는 것으로 보입니다.ONLY_FULL_GROUP_BYsql 모드가 켜져 있습니다.

ONLY_FULL_GROUP_BY SQL 모드에 대한 설명서에는 다음과 같이 나와 있습니다.

SELECT ... GROUP BY 쿼리의 경우 COUNT() 또는 MAX()와 같은 집약 함수에 전달되지 않는 한 GROUP BY 절에서 참조되지 않는 SELECT 열을 허용하지 않습니다.1055 에러가 발생.

따라서 기능 의존의 징후는 없습니다.

group by clause에 대한 설명도 확인했습니다.

그룹화되지 않은 열 또는 그룹화되지 않은 열에서 계산된 값을 선택하는 경우 반환된 값이 어느 행에서 가져올지는 정의되지 않습니다.이것은 ONLY_FULL_GROUP_BY SQL_MODE를 사용하는 경우 허용되지 않습니다.

다시 말하지만 기능 의존성의 징후는 없습니다.

위의 내용은 mariadb 버전 10.1.18 및 10.2.2에서 유효합니다.

MariaDB는 MySQL 5.5에서 분기되어 몇 가지 독창적인 기능을 개발했으며 이후 MySQL 5.6 및 5.7 버전에서 역보도된 일부 기능을 추가했습니다.

버전 5.5 이후에 개발된 MySQL의 기능은 구현이 리팩터링된 코드에 의존하기 때문에 백포트에 실용적이지 않습니다.피처 세트의 편차는 시간이 지남에 따라 커집니다.

MySQL 5.7의 기능이 필요한 경우 MySQL 5.7을 사용해야 합니다.또는 MySQL 5.7 기능을 MariaDB에 백포트하여 코드를 제공할 수도 있습니다.

코멘트 참조:MySQL의 오픈 소스 버전이 기능 종속성을 구현하지 않는 이유는 무엇입니까?

MariaDB를 "MySQL의 오픈 소스 버전"으로 호출하는 것은 MySQL이 오픈 소스가 아님을 의미합니다.그것은 당신 오해예요.MySQL Community Edition은 GNU Public License에 따라 제공되는 오픈 소스입니다.

어떤 이름을 쓰든 상관 없으면 바꿔

`pubs`.`name`

로.

ANY_VALUE(`pubs`.`name`)

5.7.5의 향상된 정교함은 아직 MariaDB에 통합되지 않았을 수 있습니다.

이렇게 하면 그룹별 불평 없이 원하는 결과를 얻을 수 있을 것입니다.

SELECT pubs.`ID`,
       r.`average`,
       pubs.`name`,
       pubs.`country`
    FROM `pubs`
    LEFT JOIN (
        SELECT pub_id,
               AVG(atmosphere) AS 'average'
               MAX(date) AS 'last_review'  -- which `date` do you want?
            FROM reviews
            GROUP BY pub_id
              ) AS r  ON r.pub_id = pubs.ID
    ORDER BY `average` DESC, last_review DESC

'이거'가 필요한지 .LEFT ★★★★★★★★★★★★★★★★★★★★★★★JOIN이데올로기 때문에

언급URL : https://stackoverflow.com/questions/40084093/does-mariadb-not-support-functional-dependencies-in-select-statements-when-group

반응형