Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MYSQL左连接结果的最后一行_Mysql - Fatal编程技术网

MYSQL左连接结果的最后一行

MYSQL左连接结果的最后一行,mysql,Mysql,我需要一些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帮助

我有一个名为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

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

试试这个。它加入了一个子选择
statusLog
,为每个
ticket\u 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

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

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
选择t.*,sl1.statusId
从作为t的票
在t.ticketId=sL1.ticketId上以sL1的形式记录左连接状态
在t.ticketId=sL2.ticketId和sL1.statusLogId
这项功能非常有效,但我不明白为什么。您在不同的别名下两次离开同一个表,并设法避免进行任何子查询。我在类似的设置下使用您的解决方案,包括文件表和文件修订表。文件表保留名称和路径,修订版保留注释、修订作者等。这就像说“从ticket join status log(sL1)中选择ticketID匹配且没有更新的状态(sL2)”对于我来说,第二次连接选择第二个匹配行而不是最后一个。它仅在只有2条记录时按预期工作,因为它显示的是第二条记录,而不是最后一条。为什么不是触发器呢?看看这个答案: