MySQL内连接获取连接表的最后一项
Posted
技术标签:
【中文标题】MySQL内连接获取连接表的最后一项【英文标题】:MySQL Inner Join Get Last Item of Joined Table 【发布时间】:2020-07-26 08:30:52 【问题描述】:有两个表:
表名:ticket
+-------+---------+---------+-------------------+
| id | title | closed | param |
+-------+--------------+------------+-----------+
| 1 | test1 | 0 | 1 |
| 2 | test2 | 1 | 1 |
| 3 | test3 | 0 | 1 |
表名:ticket_event
+-------+---------+---------+-----------------+
| id | ticket_id | event | date |
+-------+--------------+----------+-----------+
| 1 | 1 | OPENED | |
| 2 | 1 | CLOSED | |
| 3 | 2 | OPENED | |
+-------+--------------+----------+-----------+
我需要获取每张票的最后一次 ticket_event 记录。结果应该是:
test1 CLOSED
test2 OPENED
test3 NULL
我尝试了这段代码,但我得到了 ticket_event 的所有记录:
SELECT t1.title as t1Title, t2.event as t2Event FROM ticket t1 LEFT JOIN ticket_event t2 ON t1.id = t2.ticket_id
【问题讨论】:
【参考方案1】:您可以将ticket
加入到返回最后一个事件的查询中::
SELECT t.title, e.event
FROM ticket t LEFT JOIN (
SELECT e.* from ticket_event e
WHERE NOT EXISTS (
SELECT 1 FROM ticket_event
WHERE ticket_id = e.ticket_id AND id > e.id
)
) e
ON t.id = e.ticket_id
请参阅demo。 结果:
| title | event |
| ----- | ------ |
| test1 | CLOSED |
| test2 | OPENED |
| test3 | |
【讨论】:
如果有 ASSIGN 事件怎么办?它将选择 ASSIGN(认为小于 CLOSED)但是我们再次需要获得 CLOSED。我该如何解决?谢谢 你没有提到这个。那么如果有 ASSIGN 和 OPENED 哪一个会是结果呢? 总是应该是最后一个。我试图在问题标题处解释(mysql Inner Join Get Last Item of Joined Table)但我可以举例说明。 最后一个按 id 还是按日期? id 的最后一个。【参考方案2】:相关子查询可以解决问题:
select
t.title,
(
select te.event
from ticket_event te
where te.ticket_id = t.id
order by te.id desc
limit 1
) last_event
from ticket t
目前还不清楚您想使用ticket_event
中的哪一列进行排序。使用date
是有意义的,但是您的表格中该列是空的,所以我选择了id
。您可以根据自己的实际需求进行更改。
【讨论】:
以上是关于MySQL内连接获取连接表的最后一项的主要内容,如果未能解决你的问题,请参考以下文章