【问题标题】:MySQL Inner Join Get Last Item of Joined TableMySQL内连接获取连接表的最后一项
【发布时间】: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

【问题讨论】:

    标签: mysql sql join greatest-n-per-group


    【解决方案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。您可以根据自己的实际需求进行更改。

    【讨论】:

      猜你喜欢
      • 2022-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-09
      • 2015-05-26
      • 1970-01-01
      • 2014-10-16
      • 2020-03-31
      相关资源
      最近更新 更多