繁体   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