source

MySQL은 하나의 열과 대응하는 다른 열을 선택합니다.

factcode 2022. 10. 13. 23:37
반응형

MySQL은 하나의 열과 대응하는 다른 열을 선택합니다.

ID   FirstName   LastName
1      John        Doe
2      Bugs        Bunny
3      John        Johnson

하고 DISTINCTFirstName 그러나 하는 「」, 「」가 합니다.ID ★★★★★★★★★★★★★★★★★」LastName.

에는 1개만 .John단, , ,,ID과 1리터 a의LastName( ( )) 。

이 쿼리를 실행해 보세요.

 SELECT ID, FirstName, LastName FROM table GROUP BY(FirstName)

「」를 했을 때, 치 않은 가 되는 것을 .GROUP BYMySQL은 집약함수 [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/MAXid에 .

데모

쿼리

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

반응형