MySQL은 하나의 열과 대응하는 다른 열을 선택합니다.
ID FirstName LastName
1 John Doe
2 Bugs Bunny
3 John Johnson
하고 DISTINCT
의 FirstName
그러나 하는 「」, 「」가 합니다.ID
★★★★★★★★★★★★★★★★★」LastName
.
에는 1개만 .John
단, , ,,ID
과 1리터 a의LastName
( ( )) 。
이 쿼리를 실행해 보세요.
SELECT ID, FirstName, LastName FROM table GROUP BY(FirstName)
「」를 했을 때, 치 않은 가 되는 것을 .GROUP BY
MySQL은 집약함수 [sic]를 사용하지 않을 때 그룹화된 데이터 세트 내의 임의의 값을 자유롭게 취득할 수 있기 때문에 승인된 답변에서 사용되는 집약함수 없음ONLY_FULL_GROUP_BY
제외 가입을 검토해 주십시오.
제외 결합 - 모호하지 않은 도면요소
이름과 성이 고유 색인(명확함)으로 되어 있다고 가정할 경우GROUP BY
을 하다라고 하는 .LEFT JOIN
가입하다
오름차순(A~Z)
A-Z에서 성별로 정렬된 고유한 이름을 검색하려면 다음과 같이 하십시오.
쿼리
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 |
내림차순(Z-A)
Z-A에서 성별로 정렬된 고유한 이름을 검색하려면 다음과 같이 하십시오.
쿼리
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 |
★★★★IN()
- Entities - 서브쿼리
더 큰 데이터 세트의 경우 제외 결합을 사용하는 것이 매우 느릴 수 있습니다.엔트리가 경우 Composite를 사용할 .IN()
에 MIN/MAX
집약 서브쿼리
오름차순(A~Z)
쿼리
SELECT t1.*
FROM table_name AS t1
WHERE (t1.firstname, t1.lastname) IN(
SELECT firstname, MIN(lastname)
FROM table_name
GROUP BY firstname
)
결과
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
내림차순(Z-A)
쿼리
SELECT t1.*
FROM table_name AS t1
WHERE (t1.firstname, t1.lastname) IN(
SELECT firstname, MAX(lastname)
FROM table_name
GROUP BY firstname
)
결과
| id | firstname | lastname |
|----|-----------|----------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
★★★★IN()
서브쿼리 -
으로 같은 할 수 .IN()
방식, '서브쿼리'MIN/MAX
id에 .
쿼리
SELECT t1.*
FROM table_name AS t1
WHERE t1.id IN(
SELECT MIN(id)
FROM table_name
WHERE (t1.firstname, t1.lastname) IN(
SELECT firstname, MIN(lastname)
FROM table_name
GROUP BY firstname
)
GROUP BY firstname, lastname
);
결과
| id | firstname | lastname |
|----|-----------|----------|
| 1 | John | Doe |
| 2 | Bugs | Bunny |
주문된 서브쿼리
편집
주문된 서브쿼리를 사용한 답변은 MySQL 5.7.5보다 이전 버전으로 작성되었습니다.그 대신 위의 예 중 하나를 사용해 주십시오.
또, 주의할 필요가 있습니다.ONLY_FULL_GROUP_BY
디세이블(MySQL 5.7.5 이전 동작),GROUP BY
집계 함수가 없으면 MySQL은 그룹화할 데이터 세트 내의 모든 값을 자유롭게 선택할 수 있기 때문에 예기치 않은 결과가 발생할 수 있습니다.
의 의미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
결과(MySQL 5.6)
| ID | first | last |
|----|-------|---------|
| 2 | Bugs | Bunny |
| 3 | John | Johnson |
비교
사용 시 예상치 못한 결과를 시연하기 위해GROUP BY
와 조합하여ORDER BY
쿼리
SELECT * FROM table_name GROUP BY FirstName ORDER BY ID DESC
결과(MySQL 5.6)
| ID | first | last |
|----|-------|-------|
| 2 | Bugs | Bunny |
| 1 | John | Doe |
그DISTINCT
키워드는 기대했던 대로 동작하지 않습니다.사용할 때SELECT DISTINCT col1, col2, col3
실제로는 모든 고유 {col1, col2, col3} 튜플을 선택하고 있습니다.
SELECT ID,LastName
From TABLE_NAME
GROUP BY FirstName
HAVING COUNT(*) >=1
어때.
`SELECT
my_distinct_column,
max(col1),
max(col2),
max(col3)
...
FROM
my_table
GROUP BY
my_distinct_column`
SELECT firstName, ID, LastName from tableName GROUP BY firstName
fyrye에서 지적한 바와 같이, 허용되는 답변은 아직 도입되지 않은 MySQL의 이전 버전에 관한 것입니다.MySQL 8.0.17(이 예에서는 사용)에서는 디세블로 하지 않는 한ONLY_FULL_GROUP_BY
다음 오류 메시지가 나타납니다.
mysql> SELECT id, firstName, lastName FROM table_name GROUP BY firstName;
ERROR 1055(42000):SELECT 목록의 식 #1은 GROUP BY 절에 없으며 GROUP BY 절의 열에 함수적으로 종속되지 않는 비집약 열 'mydatabase.table_name.id'를 포함합니다. 이는 sql_mode=only_full_group_by와 호환되지 않습니다.
fyrye에 의해 언급되지 않았지만 https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html,에 설명된 이 문제를 해결하는 한 가지 방법은 이 함수를 fyrye에 없는 열에 적용하는 것입니다.GROUP BY
부호)id
★★★★★★★★★★★★★★★★★」lastName
이 예에서는, 다음과 같이 됩니다.
mysql> SELECT ANY_VALUE(id) as id, firstName, ANY_VALUE(lastName) as lastName FROM table_name GROUP BY firstName;
+----+-----------+----------+
| id | firstName | lastName |
+----+-----------+----------+
| 1 | John | Doe |
| 2 | Bugs | Bunny |
+----+-----------+----------+
2 rows in set (0.01 sec)
전술한 문서에 기재된 바와 같이
이 경우 MySQL은 각 이름 그룹 내의 주소 값의 비결정성을 무시하고 쿼리를 받아들입니다.이 값은 각 그룹에 대해 선택된 비집약 열 값을 신경 쓰지 않는 경우에 유용할 수 있습니다.
ANY_VALUE()
, 는 .SUM()
★★★★★★★★★★★★★★★★★」COUNT()
그것은 단지 비결정론의 시험을 억제하는 역할을 한다.
MySQL에서 이 작업을 수행할 수 있을지 모르겠지만 T-SQL에서 CTE를 사용할 수 있습니다.
; WITH tmpPeople AS (
SELECT
DISTINCT(FirstName),
MIN(Id)
FROM People
)
SELECT
tP.Id,
tP.FirstName,
P.LastName
FROM tmpPeople tP
JOIN People P ON tP.Id = P.Id
그렇지 않으면 임시 테이블을 사용해야 할 수 있습니다.
그룹 by 및 by order by를 사용할 경우 MySQL은 선택문의 일부가 아닌 열을 그룹 내에서 사용하거나 순서대로 정렬할 수 있는 유일한 데이터베이스입니다.
예를 들어, 테이블 그룹에서 컬럼2의 순서로 컬럼1을 선택합니다3
Postgres, Oracle, MSSQL 등의 다른 데이터베이스에서는 사용할 수 없습니다.이러한 데이터베이스에서는 다음 작업을 수행해야 합니다.
표 그룹에서 열 1, 열 2, 열 3을 열 2개씩 선택합니다.
현재 코드를 다른 데이터베이스로 마이그레이션하거나 다른 데이터베이스에서 작업을 시작하고 코드를 재사용할 경우에 대비하여 몇 가지 정보만 제공합니다.
group by를 사용하여 고유한 값 및 대응하는 필드를 표시할 수 있습니다.
select * from tabel_name group by FirstName
이 출력은 다음과 같습니다.
ID FirstName LastName
2 Bugs Bunny
1 John Doe
라고
ID FirstName LastName
1 John Doe
2 Bugs Bunny
이 쿼리를 사용합니다.
select * from table_name group by FirstName order by ID
SELECT DISTINCT(firstName), ID, LastName from tableName GROUP BY firstName
IMO가 최선일 것이다.
SELECT DISTINCT (column1), column2
FROM table1
GROUP BY column1
언급URL : https://stackoverflow.com/questions/5967130/mysql-select-one-column-distinct-with-corresponding-other-columns
'source' 카테고리의 다른 글
PHP를 사용하여 두 날짜의 차이를 계산하는 방법은 무엇입니까? (0) | 2022.10.13 |
---|---|
PHP에서 시간 차이를 분 단위로 가져오는 방법 (0) | 2022.10.13 |
System.out.println 출력 컬러링 방법 (0) | 2022.10.13 |
JavaScript에서 두 변수를 스왑하는 방법 (0) | 2022.10.13 |
PHP: bool vs boolean type 힌트 (0) | 2022.10.13 |