[SQL] 어떻게 GROUP BY를 사용하여 각 그룹의 최신 기록을 얻으려면? [복제]
SQL어떻게 GROUP BY를 사용하여 각 그룹의 최신 기록을 얻으려면? [복제]
하자 내가 테이블에게 열라는 메시지가 말 :
id | from_id | to_id | subject | message | timestamp
당신이 실제 스레드를 드릴 다운하기 전에 당신이 당신의 페이스 북의받은 편지함에서 보는 것처럼, 각 사용자의 최신 메시지를 받게하고 싶습니다.
이 쿼리는 결과 I 필요에 가까운 저를 얻을 것 같다 :
SELECT * FROM messages GROUP BY from_id
그러나 쿼리 나에게 각 사용자가 아닌 최신에서 가장 오래된 메시지를주고있다.
나는이 일을 알아낼 수 없습니다.
해결법
-
==============================
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.이 시도
이 시도
SELECT * FROM messages where id in (SELECT max(id) FROM messages GROUP BY from_id ) order by id desc
-
==============================
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.이 표준 문제입니다.
이 표준 문제입니다.
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.그냥 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.당신이 그들을 주문해야합니다.
당신이 그들을 주문해야합니다.
타임 스탬프 DESC의 LIMIT 1 BY from_id ORDER BY 메시지 그룹에서 SELECT *
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
'SQL' 카테고리의 다른 글
[SQL] SQL Server의 데이터베이스의 모든 테이블 사이의 관계를 알고 (0) | 2020.05.08 |
---|---|
[SQL] SQL 성능 : WHERE WHERE (ROW_NUMBER) 대 (0) | 2020.05.08 |
[SQL] 가장 최근의 기록을 검색하는 SQL 쿼리를 작성 (0) | 2020.05.08 |
[SQL] 임의의 날짜 행을 업데이트하는 방법 (0) | 2020.05.08 |
[SQL] 다른 하나 개의 테이블에서 SQL 데이터를 이동 (0) | 2020.05.08 |