programing

MySQL(MardiaDB) 종속 테이블의 최신 레코드에서 정보를 가져오는 방법은 무엇입니까?

javajsp 2023. 7. 23. 14:01

MySQL(MardiaDB) 종속 테이블의 최신 레코드에서 정보를 가져오는 방법은 무엇입니까?

2개의 기본 테이블이 있는 MySQL 데이터베이스(일부 서버에서는 MariaDB로도 작동)가 있습니다.하나는tickets그리고 또 하나는ticket_contents아래와 같이:

Tickets
+----+---------+-------------+
|id  + subject | Create date |
+----+---------+-------------+
|1   | Ticket1 | 2020-05-24  |
+----+---------+-------------+
|2   | Ticket2 | 2020-05-25  |
+----+---------+-------------+
Ticket Contents
+----+-----------+---------------------+-------------+
|id  + ticket_id | update date_time    | content     |
+----+-----------+---------------------+-------------+
|1   | 1         | 2020-05-24 08:30:15 | msg1        |
+----+-----------+---------------------+-------------+
|1   | 2         | 2020-05-25 10:05:15 | msg2        |
+----+-----------+---------------------+-------------+
|1   | 1         | 2020-05-25 12:15:00 | msg3        |
+----+-----------+---------------------+-------------+

제가 필요로 하는 것은 전체 티켓에 대한 최신 업데이트 순서와 최신 콘텐츠 기록 시간이 포함된 티켓 목록입니다.

+----------+----------+---------------------+
|ticket_id |subject   |last_update          |
+----------+---_------+---------------------+
|1         | Ticket1  | 2020-05-25 12:15:00 |
+----------+----------+---------------------+
|2         | Ticket2  | 2020-05-25 10:05:15 |
+----------+----------+---------------------+

이 코드는 제가 작성한 코드이지만 올바른 최신 자녀 기록 정보를 제공하지 않습니다.

SELECT t.id, c.date_time FROM tickets t JOIN 
   (SELECT ticket_id, date_time FROM tickets_contents GROUP BY ticket_id) c on t.id = c.ticket_id 
group by t.id order by date_time desc 

제 SQL 코드를 수정하는 것을 도와주실 수 있나요?

거의 맞았습니다. 그룹 BY의 가장 높은 날짜를 얻으려면 MAX를 사용해야 합니다.

SELECT t.id,t.subject,t2.maxtime
FROM Tickets t 
INNER JOIN (SELECT MAX(`update date_time`) maxtime,ticket_id FROM `Ticket Contents` GROUP BY ticket_id) t2
ON t.id = t2.ticket_id
id | 주제 | 최대 시간-: | :------ | :------------------1 | 티켓 1 | 2020-05-25 12:15:002 | 티켓2 | 2020-05-25 10:05:15

db<>여기로 이동

DBMS 버전이 10.2+인 경우 다음과 같은 창 기능이 있습니다.RANK()최신 업데이트가 있는 티켓을 확인하는 데 사용할 수 있습니다.

SELECT tt.id AS ticket_id, tt.subject, tt.date_time AS last_update
  FROM
  (
   SELECT t.*, tc.date_time,
          RANK() OVER (PARTITION BY tc.ticket_id ORDER BY tc.date_time DESC ) AS rnk
     FROM tickets t
     JOIN tickets_contents tc
       ON tc.ticket_id = t.id
  ) tt    
  WHERE rnk = 1
  ORDER BY ticket_id;

Demo

어디에PARTITION BY각 열의 그룹화를 나타냅니다(이 경우: ticket_id).ORDER BY ... DESC마지막 레코드(이 경우: 최신)를 필터링하는 사용됩니다.

언급URL : https://stackoverflow.com/questions/62003645/how-to-fetch-the-information-from-latest-record-in-mysql-mardiadb-dependent-ta