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内连接获取连接表的最后一项的主要内容,如果未能解决你的问题,请参考以下文章

MySQL数据库操作联表查询事务

MySQL中join连接,内连接,外连接,连接算法,优化

MySQL最后一章小知识分享(大家走过路过不要错过)

MySql表的内连和外连

mysql中3个表的内连接

MySQL 表的内连和外连