복붙노트

[SQL] 어떻게 GROUP BY를 사용하여 각 그룹의 최신 기록을 얻으려면? [복제]

SQL

어떻게 GROUP BY를 사용하여 각 그룹의 최신 기록을 얻으려면? [복제]

하자 내가 테이블에게 열라는 메시지가 말 :

id | from_id | to_id | subject | message | timestamp

당신이 실제 스레드를 드릴 다운하기 전에 당신이 당신의 페이스 북의받은 편지함에서 보는 것처럼, 각 사용자의 최신 메시지를 받게하고 싶습니다.

이 쿼리는 결과 I 필요에 가까운 저를 얻을 것 같다 :

SELECT * FROM messages GROUP BY from_id

그러나 쿼리 나에게 각 사용자가 아닌 최신에서 가장 오래된 메시지를주고있다.

나는이 일을 알아낼 수 없습니다.

해결법

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

    1.각 그룹의 마지막 타임 스탬프 값 (하위 쿼리)를 발견하고 테이블이 하위 쿼리에 가입해야합니다 -

    각 그룹의 마지막 타임 스탬프 값 (하위 쿼리)를 발견하고 테이블이 하위 쿼리에 가입해야합니다 -

    SELECT t1.* FROM messages t1
      JOIN (SELECT from_id, MAX(timestamp) timestamp FROM messages GROUP BY from_id) t2
        ON t1.from_id = t2.from_id AND t1.timestamp = t2.timestamp;
    
  2. ==============================

    2.이 시도

    이 시도

    SELECT * FROM messages where id in (SELECT max(id) FROM messages GROUP BY from_id ) order by id desc
    
  3. ==============================

    3.이 모든 Form_id에 대한 마지막 레코드를 반환 쿼리

    이 모든 Form_id에 대한 마지막 레코드를 반환 쿼리

        SELECT m1.*
         FROM messages m1 LEFT JOIN messages m2
         ON (m1.Form_id = m2.Form_id AND m1.id < m2.id)
         WHERE m2.id IS NULL;
    
  4. ==============================

    4.이 표준 문제입니다.

    이 표준 문제입니다.

    MySQL은 당신이 표준 SQL하지 않는 GROUP BY 절에서 열을 생략 할 수 있습니다,하지만 당신은 MySQL의 기능을 사용할 때 일반적으로 결정 결과를 얻을하지 않습니다.

    SELECT *
      FROM Messages AS M
      JOIN (SELECT To_ID, From_ID, MAX(TimeStamp) AS Most_Recent
              FROM Messages
             WHERE To_ID = 12345678
             GROUP BY From_ID
           ) AS R
        ON R.To_ID = M.To_ID AND R.From_ID = M.From_ID AND R.Most_Recent = M.TimeStamp
     WHERE M.To_ID = 12345678
    

    나는 당신이 가능성이있어 일치하는 To_ID에 필터를 추가했습니다. 쿼리없이 작동하지만 일반적으로 더 많은 데이터를 반환합니다. 조건은 중첩 된 쿼리 및 외부 쿼리 (최적화 프로그램이 자동으로 상태를 밀어한다) 모두에 명시 할 필요가 없습니다,하지만 그림과 같이 조건을 반복 할 해를 할 수 없다.

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

    5.그냥 Devart는, 아래의 코드는 질문에 따라 주문하지 않는 말을 보완 :

    그냥 Devart는, 아래의 코드는 질문에 따라 주문하지 않는 말을 보완 :

    SELECT t1.* FROM messages t1
      JOIN (SELECT from_id, MAX(timestamp) timestamp FROM messages GROUP BY from_id) t2
        ON t1.from_id = t2.from_id AND t1.timestamp = t2.timestamp;
    

    "그룹 BY"절은 메인 쿼리에 있어야합니다 우리는 "소스"는 그래서 "그룹화"필요한 수에 순서를 먼저해야한다는 가입일 :

    SELECT t1.* FROM messages t1
      JOIN (SELECT from_id, MAX(timestamp) timestamp FROM messages ORDER BY timestamp DESC) t2
        ON t1.from_id = t2.from_id AND t1.timestamp = t2.timestamp GROUP BY t2.timestamp;
    

    문안 인사,

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

    6.당신이 그들을 주문해야합니다.

    당신이 그들을 주문해야합니다.

    타임 스탬프 DESC의 LIMIT 1 BY from_id ORDER BY 메시지 그룹에서 SELECT *

  7. from https://stackoverflow.com/questions/10999522/how-to-get-the-latest-record-in-each-group-using-group-by by cc-by-sa and MIT license