簡體   English   中英

如何從 MySQL (MardiaDB) 依賴表中的最新記錄中獲取信息?

[英]How to fetch the information from latest record in MySQL (MardiaDB) dependent table?

我有一個帶有 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 代碼嗎?

你幾乎是對的,你必須使用 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
 編號 | 主題 | 最大時間 -: |:------ |:----------------- 1 | 票1 |  2020-05-25 12:15:00 2 | 票2 |  2020-05-25 10:05:15

db<> 在這里擺弄

如果您的 DBMS 版本是 10.2+,那么 window 函數(例如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用於過濾最后一條記錄(在這種情況下: latest )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM