programing

GROUP BY가 없는 집계 쿼리

css3 2023. 9. 7. 21:58

GROUP BY가 없는 집계 쿼리

이 쿼리는 내 오래된 기계에서 완벽하게 작동하는 것 같습니다.그러나 MySQL 5.7.14 및 PHP 5.6.25가 있는 새 컴퓨터에서는 다음과 같은 오류가 발생합니다.

치명적 오류:'SQLSTATE[42000]' 메시지와 함께 탐지되지 않은 예외 'PDOException':구문 오류 또는 액세스 위반: 1140 GROUP BY가 없는 집계 쿼리에서 SELECT 목록의 식 #1에 집계되지 않은 열 'pixel_perfect.users.id '이 포함되어 있습니다. 이 열은 C:\wamp64\wwww의 sql_mode=only_full_group_by'와 호환되지 않습니다.

내 쿼리는 다음과 같습니다.

$sql="SELECT id, password, COUNT(id) AS count FROM users WHERE email = :email LIMIT 1";

$stmt=$db->prepare($sql);
$stmt->bindValue(':email', $email);
$stmt->execute();

지금 이 오류가 발생하는 이유는 무엇이며 이를 해결하려면 어떻게 해야 합니까?

버전 5.7.5에서는 기본적으로 함수를 사용하여 집계하는 쿼리를 거부합니다(sum,avg,max, 등)에서SELECTclause and failure to put the non-certified fields in theGROUP BY이러한 동작은 다른 모든 RDBMS에 영향을 미치며 MySQL은 마침내 실행에 옮겨지고 있습니다.

두 가지 옵션이 있습니다.

  1. MySQL 설정을 기본값으로 이전 동작으로 변경하여 이와 같이 그다지 크지 않은 쿼리를 허용할 수 있습니다.정보는 여기서 찾을 수 있습니다.
  2. 쿼리를 수정할 수 있습니다.

옵션 2는 다음과 같습니다.

SELECT id, password, COUNT(id) AS count FROM users WHERE email = :email GROUP BY id, password LIMIT 1

또한 GROUP BY 절에서 집계되지 않은 열이 단일 값(WHERE 절의 필터 등)으로 제한된 경우 5.7.5 이상 버전에서는 집계되지 않은 열을 제외할 수 있습니다.이 허용된 예외의 예는 위 링크를 참조하십시오.

조금 늦었지만 제가 방금 이 오류를 범했습니다.

이 명령은 동일한 오류가 발생한 다른 사용자에게 유용할 수 있습니다.

     mysql > SET GLOBAL sql_mode=(SELECT REPLACE(@@sql_mode,'ONLY_FULL_GROUP_BY',''));

이에 대한 자세한 내용은 테이블 플러스 및 위에서 인용한 JNevill의 기타 링크에서 확인할 수 있습니다.

다른 사람에게 도움이 되길 바랍니다.

구성/데이터베이스에서 가장 쉬운 답변입니다.php는 mysql 설정에 대해 strict => true를 strict => false로 설정해야 합니다.

이렇게 하면 정상적인 형식의 sql 호출에 대해 보안 비용으로 엄격하지 않은 쿼리를 허용할 수 있지만(여전히 100% 안전하지 않음), 부적절하게 작성된 경우 안전하지 않을 수 있는 다른 sql 호출을 사용할 수 있습니다.

SQL 모드를 기본값으로 변경합니다.오류 없이 실행됩니다. SQL 모드는 쿼리의 구문을 정의합니다.ONLY_FLUY_GROUPBY를 사용하는 경우 모든 Aggregator 함수에 대해 group by로 쿼리를 작성해야 합니다.

언급URL : https://stackoverflow.com/questions/43481869/aggregated-query-without-group-by