如何从 MySQL (MardiaDB) 依赖表中的最新记录中获取信息?

Posted

技术标签:

【中文标题】如何从 MySQL (MardiaDB) 依赖表中的最新记录中获取信息?【英文标题】:How to fetch the information from latest record in MySQL (MardiaDB) dependent table? 【发布时间】:2020-09-12 03:56:37 【问题描述】:

我有一个带有 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 代码吗?

【问题讨论】:

【参考方案1】:

你说得差不多了,你必须使用 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小提琴here

【讨论】:

这假设了时间戳的唯一性【参考方案2】:

如果您的 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 用于过滤最后一条记录(本例中为:latest)。

【讨论】:

以上是关于如何从 MySQL (MardiaDB) 依赖表中的最新记录中获取信息?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 如何从今天记录的表中选择数据?

如何从我的 MySQL 表中删除约束?

如何从 MySQL 中的表中删除列

MySql:在联结表中选择具有相同依赖项的条目

如何从mysql表中查找逗号分隔值

如何从mysql中的表中跳过行