복붙노트

[SQL] 어떻게 그룹에 DESC 순서에 의해

SQL

어떻게 그룹에 DESC 순서에 의해

나는 다음 표라는 질문이 :

ID | asker 
1  | Bob
2  | Bob
3  | Marley

나는 한 번만 각 아스 커를 선택합니다과 같은 이름을 가진 여러 askers가있는 경우, 가장 높은 ID 중 하나를 선택합니다. 그래서, 결과를 예상 :

ID | asker 
3  | Marley
2  | Bob

나는 다음과 같은 쿼리를 사용 :

SELECT * FROM questions GROUP by questions.asker ORDER by questions.id DESC

나는 다음과 같은 결과를 얻을 :

ID | asker 
3  | Marley
1  | Bob

이 최초의 '밥'을 선택 그래서 대신 마지막으로 발견.

감사

해결법

  1. ==============================

    1.각 아스 커의 마지막 ID를 원하는 경우에, 당신은 집계 함수를 사용한다 :

    각 아스 커의 마지막 ID를 원하는 경우에, 당신은 집계 함수를 사용한다 :

    SELECT max(id) as id, 
       asker
    FROM questions 
    GROUP by asker 
    ORDER by id DESC
    

    MySQL은 선택 목록의 항목은 집계되지 및 GROUP BY 절에 포함되지 않은 될 수 있습니다 GROUP BY의 확장을 사용하기 때문에 당신이 이상한 결과를 얻고 있었다 이유입니다. MySQL은 반환되는 값을 선택할 수 있기 때문 그러나 예기치 않은 결과가 발생할 수 있습니다. (GROUP BY를 참조 MySQL의 확장)

    MySQL의 문서에서 :

    당신이 테이블에서 반환해야하지만, 당신이 얻을 수 인해 일관되지 않은 결과에 GROUP BY에 추가 싶지 않아 다른 열이 있다면 지금, 당신은 그렇게 할 하위 쿼리를 사용할 수 있습니다. (데모)

    select 
      q.Id,
      q.asker,
      q.other -- add other columns here
    from questions q
    inner join
    (
      -- get your values from the group by
      SELECT max(id) as id, 
        asker
      FROM questions 
      GROUP by asker 
    ) m
      on q.id = m.id
    order by q.id desc
    
  2. ==============================

    2.일반적으로 MySQL은 오름차순으로 기록 만 그룹화 할 수 있습니다. 그래서 우리는 그룹화하기 전에 기록을 주문할 수 있습니다.

    일반적으로 MySQL은 오름차순으로 기록 만 그룹화 할 수 있습니다. 그래서 우리는 그룹화하기 전에 기록을 주문할 수 있습니다.

    SELECT *
    FROM (
      SELECT *
      FROM questions
      ORDER BY id DESC
    ) AS questions
    GROUP BY questions.asker
    
  3. ==============================

    3.기록은 모든 아스 커의 최대의 ID를 얻기 위해 GROUP BY 및 MAX ()를 사용하여 그룹화 할 필요가있다.

    기록은 모든 아스 커의 최대의 ID를 얻기 위해 GROUP BY 및 MAX ()를 사용하여 그룹화 할 필요가있다.

    SELECT  asker, MAX(ID) ID
    FROM    TableName
    GROUP   BY asker
    

    산출

    ╔════════╦════╗
    ║ ASKER  ║ ID ║
    ╠════════╬════╣
    ║ Bob    ║  2 ║
    ║ Marley ║  3 ║
    ╚════════╩════╝
    
  4. ==============================

    4.다른 사람은 당신이 원하는 결과를 얻을 수 MAX (ID)를 사용하는 방법에 대한 올바른. 귀하의 요청이없는 작업을 수행 이유를 궁금해하는 경우 ORDER BY는 그룹 BY 후 발생 때문입니다.

    다른 사람은 당신이 원하는 결과를 얻을 수 MAX (ID)를 사용하는 방법에 대한 올바른. 귀하의 요청이없는 작업을 수행 이유를 궁금해하는 경우 ORDER BY는 그룹 BY 후 발생 때문입니다.

  5. ==============================

    5.정확히 GROUP BY 및 MAX에 사용되는 단지 열을 선택하는 경우에만 허용 대답 타린의 첫 번째 / 짧은 대안이 작동 @ 때문에이 답변을 작성 임. 사용자 묻는 질문 테이블의 모든 열을 선택하는 것입니다 (그는 SELECT *를 사용). 당신이 테이블에 다른 3 열을 추가 할 때, 쿼리 결과에서 해당 열 값이 올바르지 않을 수 있습니다. 서로 다른 테이블 행에서 혼합 된 값을 얻을 것이다. 타린의 초 / 이상 대안 @ (내부 조인과 서브 쿼리 사용) 작동하지만 쿼리는 쓸데없이 복잡하고 아래에있는 내 간단한 대안보다 5 배 느린 내 사용의 경우이다.

    정확히 GROUP BY 및 MAX에 사용되는 단지 열을 선택하는 경우에만 허용 대답 타린의 첫 번째 / 짧은 대안이 작동 @ 때문에이 답변을 작성 임. 사용자 묻는 질문 테이블의 모든 열을 선택하는 것입니다 (그는 SELECT *를 사용). 당신이 테이블에 다른 3 열을 추가 할 때, 쿼리 결과에서 해당 열 값이 올바르지 않을 수 있습니다. 서로 다른 테이블 행에서 혼합 된 값을 얻을 것이다. 타린의 초 / 이상 대안 @ (내부 조인과 서브 쿼리 사용) 작동하지만 쿼리는 쓸데없이 복잡하고 아래에있는 내 간단한 대안보다 5 배 느린 내 사용의 경우이다.

    테이블 질문을 고려 :

    id | asker 
    -----------
    1  | Bob
    2  | Bob
    3  | Marley
    

    쿼리 SELECT 최대 (ID) ID와 같은 ID의 DESC 반환 BY 애 스커 ORDER BY 질문 그룹에서 아스 커 예상 :

    id | asker 
    -----------
    3  | Marley
    2  | Bob
    

    이제 다른 테이블 질문을 고려 :

    id | asker  | other
    -------------------
    1  | Bob    | 1st
    2  | Bob    | 2nd
    3  | Marley | 3rd
    

    아이디 DESC 반환 예상치 못한 BY 애 스커 ORDER BY 질문 그룹에서 다른 아이디, 아스 커, 같은 쿼리 SELECT 최대 (ID) :

    id | asker  | other
    -------------------
    3  | Marley | 3rd
    2  | Bob    | 1st
    

    ... 참고 ID = 2 표하지만, 다른 = 1의 두 번째 행에서 오는 테이블의 첫 번째 행에서 오기 때문에 결과의 두 번째 행에 대해 다른 값이 잘못되었다고! 즉,이 솔루션은 작업을하지 않는 타린의 대답 보고서의 주석 방법 많은 사용자입니다.

    또 다른 열을 선택 가능한 간단한 솔루션은 GROUP BY + DESC를 사용하는 것입니다 :

    SELECT ID, 아스 커, 다른 질문 GROUP BY의 애 스커 DESC FROM

    id | asker  | other
    -------------------
    3  | Marley | 3rd
    2  | Bob    | 2nd
    

    (: https://www.db-fiddle.com/f/esww483qFQXbXzJmkHZ8VT/10 데모를 참조)

    ...하지만이 간단한 솔루션은 몇 가지 제한 사항이 있습니다 :

    애 스커 DESC BY 애 스커 ORDER BY 질문 그룹에서 다른 SELECT ID, 아스 커,

    id | asker  | other
    -------------------
    3  | Marley | 3rd
    2  | Bob    | 2nd
    

    (: https://www.db-fiddle.com/f/esww483qFQXbXzJmkHZ8VT/11 데모를 참조)

    ... 결과는 GROUP BY ... DESC에 상기와 동일 (이노를 사용하여 인덱스를 생성하는 것을 잊지 마세요).

  6. ==============================

    6.모든 열을 얻으려면 :

    모든 열을 얻으려면 :

    SELECT * FROM questions
    WHERE id IN 
    (SELECT max(id) as id, asker
    FROM questions 
    GROUP by asker 
    ORDER by id DESC)
    

    @bluefeet의 대답의 향상된 버전입니다.

  7. ==============================

    7.ORDER BY는 GROUP BY 후에 수행 때문이다.

    ORDER BY는 GROUP BY 후에 수행 때문이다.

    이 시도:

    SELECT * FROM questions
    WHERE id IN 
    (
        SELECT max(id) as id
        FROM questions 
        GROUP by asker 
        ORDER by id DESC
    )
    
  8. from https://stackoverflow.com/questions/15390303/how-to-group-by-desc-order by cc-by-sa and MIT license