사용하는 경우 잠재적으로 예기치 않은 결과를 방지하려면 GROUP BY
집계 함수 않고, 허용 대답에 사용되는 MySQL을 검색 할 무료이기 때문에, 모든 집계 함수 사용하지 않을 경우 그룹화 된 데이터 세트 내에서 값을 [원문] 와 문제 ONLY_FULL_GROUP_BY
. 제외 조인 사용을 고려하십시오.
제외 조인-명확한 엔터티
firstName을 가정하고 LASTNAME 고유 색인 (모호)를 , 대안 것은 GROUP BY
하여 정렬을 사용하는 것 LEFT JOIN
제외 조인으로, 결과 세트를 필터링하는 데, 그렇지 않으면 공지.
데모보기
오름차순 (AZ)
AZ에서 성으로 정렬 된 고유 한 이름을 검색하려면
질문
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname > t2.lastname
WHERE t2.id IS NULL;
결과
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
내림차순 (ZA)
ZA에서 성으로 정렬 된 고유 한 이름을 검색하려면
질문
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND t1.lastname < t2.lastname
WHERE t2.id IS NULL;
결과
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
그런 다음 원하는대로 결과 데이터를 주문할 수 있습니다.
제외 조인-모호한 엔터티
이름과 성 조합이 고유하지 않고 (모호한) 동일한 값의 여러 행이있는 경우 JOIN 기준에 OR 조건을 포함시켜 결과 세트를 필터링하여 id로도 필터링 할 수 있습니다.
데모보기
table_name 데이터
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson'),
(4, 'John', 'Doe'),
(5, 'John', 'Johnson')
질문
SELECT t1.*
FROM table_name AS t1
LEFT JOIN table_name AS t2
ON t1.firstname = t2.firstname
AND (t1.lastname > t2.lastname
OR (t1.firstname = t1.firstname AND t1.lastname = t2.lastname AND t1.id > t2.id))
WHERE t2.id IS NULL;
결과
| id | firstname | lastname |
|----|-----------|----------|
| 1 | John | Doe |
| 2 | Bugs | Bunny |
정렬 된 하위 쿼리
편집하다
정렬 된 하위 쿼리를 사용하는 원래의 답변 은 MySQL 5.7.5 이전에 작성되었으며로 변경 되었으므로 더 이상 적용 할 수 없습니다 ONLY_FULL_GROUP_BY
. 위의 제외 조인 예제를 대신 사용하십시오.
참고하는 것도 중요합니다. 때 ONLY_FULL_GROUP_BY
비활성화 (5.7.5 MySQL의 이전 동작이 일본어) 의 사용 GROUP BY
MySQL이 자유롭게 선택할 수 있기 때문에 집합 기능이없는 예기치 않은 결과를 산출 할 수 ANY 그룹화되는 데이터 세트 내의 값 [SIC] .
검색된 행 과 연관되지 않은ID
또는 lastname
값을 검색 할 수 있음을 의미합니다 .firstname
경고
MySQL과 함께 사용 GROUP BY
하면 예상 결과를 얻지 못할 수 있습니다ORDER BY
테스트 사례 예 참조
예상되는 결과를 보장하는 가장 좋은 구현 방법은 정렬 된 하위 쿼리를 사용하여 결과 집합 범위를 필터링하는 것입니다.
table_name 데이터
(1, 'John', 'Doe'),
(2, 'Bugs', 'Bunny'),
(3, 'John', 'Johnson')
질문
SELECT * FROM (
SELECT * FROM table_name ORDER BY ID DESC
) AS t1
GROUP BY FirstName
결과
| ID | first | last |
|----|-------|---------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
비교
GROUP BY
와 함께 사용할 때 예기치 않은 결과를 보여주기 위해ORDER BY
질문
SELECT * FROM table_name GROUP BY FirstName ORDER BY ID DESC
결과
| ID | first | last |
|----|-------|-------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |