如何从 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 的最高日期
编号 |主题 |最大时间 -: | :-------- | :----------------- 1 |票1 | 2020-05-25 12:15:00 2 |票2 | 2020-05-25 10:05:15SELECT 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
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) 依赖表中的最新记录中获取信息?的主要内容,如果未能解决你的问题,请参考以下文章