programing

GROUP BY를 사용하여 각 그룹의 최신 레코드를 얻는 방법은 무엇입니까?

bestcode 2022. 12. 27. 21:18
반응형

GROUP BY를 사용하여 각 그룹의 최신 레코드를 얻는 방법은 무엇입니까?

예를 들어 테이블이 있다고 칩시다messages열 포함:

id | from_id | to_id | subject | message | timestamp

실제 스레드를 드릴다운하기 전에 Facebook 수신 트레이에서 볼 수 있는 것처럼 각 사용자로부터만 최신 메시지를 받고 싶습니다.

이 쿼리를 통해 필요한 결과를 얻을 수 있을 것 같습니다.

SELECT * FROM messages GROUP BY from_id

그러나 쿼리는 각 사용자로부터 최신이 아닌 가장 오래된 메시지를 받고 있습니다.

이건 이해할 수 없어요.

마지막으로 알아봐야지timestamp각 그룹(서브쿼리)의 값을 지정한 후 이 서브쿼리를 테이블에 결합합니다.

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;

이거 드셔보세요

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

이 쿼리는 모든 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;

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;

"GROUP BY" 절이 메인 쿼리에 있어야 합니다. 먼저 "SOURCE"를 재정렬하여 필요한 "GROUP 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;

안부 전해요,

이것은 표준적인 문제입니다.

MySQL에서는 GROUP BY 절에서 열을 생략할 수 있지만 표준 SQL에서는 생략할 수 없지만 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당신이 가질 수 있는 것과 일치합니다.쿼리는 이 쿼리가 없어도 작동하지만 일반적으로 훨씬 더 많은 데이터를 반환합니다.조건을 네스트된 쿼리와 외부 쿼리에 모두 기술할 필요는 없습니다(옵티마이저는 조건을 자동으로 푸시 다운해야 합니다).다만, 이 조건을 반복해도 문제가 되지 않습니다.

주문하셔야 합니다.

SELECT * FROM messages GROUP BY from_id ORDER BY timestamp DESC LIMIT 1

언급URL : https://stackoverflow.com/questions/10999522/how-to-get-the-latest-record-in-each-group-using-group-by

반응형