【问题标题】:MYSQL Left Join last row of resultMYSQL Left Join 最后一行结果
【发布时间】:2011-09-20 13:17:25
【问题描述】:

我需要一些 MYSQL 帮助。

我有一个名为 Tickets 的表和一个名为 statusLogs 的表我该怎么做:

select 
  t.*,
  sl.statusId
from
  ticket LEFT JOIN (
    select * from statusLog where ticket_ticketId = t.ticketId order by statusLogId DESC LIMIT 1
  ) sl

基本上,我想在一个语句中选择给定票号的最后一个状态日志。

【问题讨论】:

标签: mysql


【解决方案1】:

试试这个。它加入了statusLog 的子选择,它为每个ticket_ticketId 拉出最高的(因此我认为是最近的)statusLogId。这将检索票证的 statusLogId。然后,进一步的连接将statusId 与位于第一个连接中的statusLogId 匹配。

SELECT
  t.*,
  slid.statusId
FROM
  ticket t LEFT JOIN (
    SELECT ticket_ticketId, MAX(statusLogId) AS statusLogId FROM statusLog GROUP BY ticket_ticketId
  ) sl ON t.ticketId = sl.ticket_ticketId
  JOIN statusLog slid ON slid.statusLogId = sl.statusLogId

【讨论】:

    【解决方案2】:

    这是未经测试的,但这是我的方法之一:

    SELECT t.*, sl1.statusId
    FROM ticket AS t
    LEFT JOIN statusLog AS sL1 ON t.ticketId = sL1.ticketId 
    LEFT JOIN statusLog AS sL2 ON t.ticketId = sL2.ticketId AND sL1.statusLogId < sL2.statusLogId 
    WHERE sL2.statusLogId IS NULL
    

    【讨论】:

    • 这很好用,但我不明白为什么。您以不同的别名两次离开加入同一个表,并设法避免进行任何子查询。我在类似的设置下使用您的解决方案,带有文件表和文件修订表。文件表保存名称和路径,修订版本保存 cmets、修订作者等...
    • 这就像说“从票证加入状态日志 (sL1) 中选择票证ID 匹配并且没有更新的状态 (sL2)”
    • 对我来说第二个连接选择第二个匹配行而不是最后一个
    • 只有当您只有 2 条记录时它才会按预期工作,因为它显示的是第二条记录而不是最后一条记录。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-01
    • 2013-11-28
    • 2016-09-10
    • 2019-07-21
    • 2020-11-04
    相关资源
    最近更新 更多