2016-12-14 2 views
-2

편집 얻기 : 이는 글로벌 sql_mode 설정을 변경할 수있는 대답에 질문 #1055 - Expression of SELECT list is not in GROUP BY clause and contains nonaggregated column this is incompatible with sql_mode=only_full_group_byGROUP BY의 MySQL 처리. ONLY_FULL_GROUP_BY 오류를

이 올바르지의 가능한 중복 된 것으로 확인되었습니다. MySQL은 ONLY_FULL_GROUP_BY를 기본으로 변경했습니다. functional dependencies and returning arbitrary data

제 질문과 대답은 간략하지만 정확하지만 더 자세한 내용을 사용하여 설명을 간략히 설명합니다. 그래서

+-----------+-------------+-----------+----------+-------+ 
| productID | productCode | name  | quantity | price | 
+-----------+-------------+-----------+----------+-------+ 
|  1001 | PEN   | Pen Red |  5000 | 1.23 | 
|  1002 | PEN   | Pen Blue |  8000 | 1.25 | 
|  1003 | PEN   | Pen Black |  2000 | 1.25 | 
|  1004 | PEC   | Pencil 2B | 10000 | 0.48 | 
|  1005 | PEC   | Pencil 2H |  8000 | 0.49 | 
+-----------+-------------+-----------+----------+-------+ 

내가 명령을 실행하는 경우 : 그래서

ERROR 1055 (42000): Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'southwind.products.productID' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 

에서 : 나는 다음과 같은 오류가

SELECT * FROM products GROUP BY productCode; 

을 다음과 같이

읽어 주셔서 감사합니다, 테이블입니다 내 GROUP BY 인수에 중복 값이 ​​있기 때문에 mysql documentation을 읽었습니다. 임의로 뭔가를 반환하기를 거부하면서 오류가 발생합니다. 차라리이 기능을 사용 중지하지 않으므로 쿼리 작업을 위해 누락 된 부분을 이해하는 데 도움이됩니다.

감사합니다.

당신의 모드에 따라
+0

각 productCode에 동일한 행이 없으므로 각 행에 대해 원하는 행을 반환 하시겠습니까? – Mihai

답변

1

, 당신은 다음과 같이 수행하면 제품 코드에 의해 그룹이 함께 마지막 두 하나를 함께 처음 세 개의 기록을 의미 할 때, 때문에

SELECT Max(price) FROM products GROUP BY productCode; 

당신은 그 오류를 참조하십시오 그리고 당신 때문에 select *을 사용하여 모든 필드를 표시하고 싶습니다. 그래서 문제는 세 가지가 다른 것입니다. productID도 갖고 싶다면 GROUP_CONCAT()을 사용해야합니다.

SELECT GROUP_CONCAT(`productID ` separator ',') as ids , Max(price) FROM products GROUP BY productCode; 

그래서 모든 ID를 문자열로 연결합니다.

0

오류를 피하는 방법을 알아 냈습니다. 위 표에는 productCode에 중복 값이 ​​있습니다. MySQL은 GROUP BY에 오류를 던질 것을 요구할 때 명시 적으로 그 행을 잡을 행이 주어지지 않는다. SELECT 인수에서 정확히 어떤 열 값을 가져올지를 묻기를 원합니다.

다음과 같이 이제 내 SELECT 인수에 집계 함수를 사용하여 :

SELECT COUNT(productID),productCode, MAX(name), MAX(quantity), MAX(price) FROM products GROUP BY productCode; 

내가 얻을로 설정 한 결과는 다음과 같습니다

+------------------+-------------+-----------+---------------+------------+ 
| COUNT(productID) | productCode | MAX(name) | MAX(quantity) | MAX(price) | 
+------------------+-------------+-----------+---------------+------------+ 
|    2 | PEC   | Pencil 2H |   10000 |  0.49 | 
|    3 | PEN   | Pen Red |   8000 |  1.25 | 
+------------------+-------------+-----------+---------------+------------+ 

이가 이후 테이블의 실제 행 수없는 명확하게하기 위해 고유 한 productCode "그룹"의 행 수를 productID에 COUNT 개 찾았습니다. 또한 열의 MAX 값을 찾고 있습니다.저를주기

SELECT * FROM products WHERE productID = 1004 OR productID = 1001; 

:

SELECT MIN(productID), productCode FROM products GROUP BY productCode; 
+----------------+-------------+ 
| MIN(productID) | productCode | 
+----------------+-------------+ 
|   1004 | PEC   | 
|   1001 | PEN   | 
+----------------+-------------+ 
다음

:

+-----------+-------------+-----------+----------+-------+ 
| productID | productCode | name  | quantity | price | 
+-----------+-------------+-----------+----------+-------+ 
|  1001 | PEN   | Pen Red |  5000 | 1.23 | 
|  1004 | PEC   | Pencil 2B | 10000 | 0.48 | 
+-----------+-------------+-----------+----------+-------+ 

나는 제품 코드를 기반으로 실제의 고유 행을 얻고 싶었다 경우

, 나는이 두 문장을 사용하여 수 그래서 다시 다른 컬럼에 대해 명시해야합니다. 누군가가 코멘트에 이것을 추가하고 싶다면 해주십시오. 감사.

+0

좋습니다. 너를 도우려고 했어. 내가 너를 만족하게 만들 의무가 없다면, 미안해. 내 대답을 되풀이하는거야. 하지만 상관 없어 –

+0

BTW, 왜 당신은 내가 영리한 대답을하는 데 대한 귀하의 의견을 제거 했습니까! 그것은 그것이 파괴적이지 않은 것처럼 보인다!! –

관련 문제