programing

MySQL의 다른 일부 열과 함께 고유 열 선택

stoneblock 2023. 9. 26. 21:56

MySQL의 다른 일부 열과 함께 고유 열 선택

다음(아마도 오래된) 문제에 대한 적절한 해결책을 찾을 수 없는 것 같아서 누군가가 빛을 볼 수 있기를 바랍니다.나는 내 SQL에 있는 다른 고유하지 않은 열과 함께 하나의 고유한 열을 반환해야 합니다.

제 SQL에는 다음 표가 있습니다.

id      name       destination     rating     country
----------------------------------------------------
1       James      Barbados        5          WI
2       Andrew     Antigua         6          WI
3       James      Barbados        3          WI
4       Declan     Trinidad        2          WI
5       Steve      Barbados        4          WI
6       Declan     Trinidad        3          WI

국가별 등급과 함께 목적지와 함께 DISKENT 이름을 반환하는 SQL 문을 원합니다.

id      name       destination     rating     country
----------------------------------------------------
1       James      Barbados        5          WI
2       Andrew     Antigua         6          WI
4       Declan     Trinidad        2          WI
5       Steve      Barbados        4          WI

보시다시피 제임스와 데클란은 등급은 다르지만 이름은 같아서 한 번만 돌려받습니다.

다음 쿼리는 등급이 다르기 때문에 모든 행을 반환합니다.위 결과 세트를 반품할 수 있는 방법이 없을까요?

SELECT (distinct name), destination, rating 
  FROM table 
 WHERE country = 'WI' 
 ORDER BY id

서브쿼리를 사용하면 가장 높은 값을 얻을 수 있습니다.id각 이름에 대해 다음을 기준으로 나머지 행을 선택합니다.

SELECT * FROM table
WHERE id IN (
  SELECT MAX(id) FROM table GROUP BY name
)

원하신다면, 사용하세요.MIN(id)각각의 이름에 대한 첫 번째 기록을 얻기 위해서입니다.

그것은 또한 그것으로 할 수 있습니다.INNER JOIN서브쿼리에 대하여이를 위해서는 성능이 유사해야 하며 하위 쿼리의 두 에 결합해야 하는 경우도 있습니다.

SELECT
  table.*
FROM 
  table
  INNER JOIN (
    SELECT MAX(id) AS id FROM table GROUP BY name
  ) maxid ON table.id = maxid.id

문제는 첫 번째 필드가 아닌 전체 반환 세트에 걸쳐 구별된 기능이 작동한다는 것입니다.그렇지 않으면 MySQL은 어떤 레코드를 반환해야 할지 알 수 없습니다.따라서 MAX, MIN, GROUP_CONCAT, AVG, 또는 여러 다른 기능 중에서 등급에 대한 그룹 기능을 사용하고자 합니다.

마이클은 이미 좋은 답변을 올렸기 때문에 질의를 다시 작성하지는 않을 것입니다.

@rcdmk에 동의합니다. 종속적인 하위 쿼리를 사용하면 성능이 저하될 수 있습니다. 국가 필드를 이미 색인화하고 몇 행만 서버에 도달한다면 GROUP BY가 더 적합할 것 같습니다.쿼리 giben을 @rcdmk로 다시 작성하면서, GROUP BY에 의한 암묵적인 순서 지정을 억제하기 위해 ORDER BY NULL 절을 추가하여 조금 더 빠르게 처리했습니다.

SELECT MIN(id) as id, name, destination as rating, country 
FROM table WHERE country = 'WI' 
GROUP BY name, destination ORDER BY NULL

당신은 할 수 있습니다.GROUP BY조항:

SELECT MIN(id) AS id, name, destination, AVG(rating) AS rating, country
FROM TABLE_NAME
GROUP BY name, destination, country

이 쿼리는 하위 쿼리 대안보다 대규모 데이터 세트에서 더 나은 성능을 발휘하며 읽기도 더 쉬울 수 있습니다.

언급URL : https://stackoverflow.com/questions/8552192/select-distinct-column-along-with-some-other-columns-in-mysql