Как получить информацию из последней записи в зависимой таблице MySQL (MardiaDB)? - PullRequest
1 голос
/ 25 мая 2020

У меня есть база данных 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, пожалуйста?

Ответы [ 2 ]

1 голос
/ 25 мая 2020

Вы сделали это почти правильно, вы должны использовать MAX, чтобы получить самую высокую дату GROUP BY

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 | subject | maxtime            
-: | :------ | :------------------
 1 | Ticket1 | 2020-05-25 12:15:00
 2 | Ticket2 | 2020-05-25 10:05:15

db <> fiddle здесь

0 голосов
/ 25 мая 2020

При условии, что версия вашей СУБД 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;

Демо

, где PARTITION BY обозначает группировку для каждого соответствующего столбца (в данном случае: ticket_id ), а ORDER BY ... DESC используется для фильтрации последней записи (в данном случае: последний ).

...