仅对 MYSQL 中最后返回的行执行 JOIN [重复]
Posted
技术标签:
【中文标题】仅对 MYSQL 中最后返回的行执行 JOIN [重复]【英文标题】:Perform JOIN only on the last returned row in MYSQL [duplicate] 【发布时间】:2020-06-27 18:07:16 【问题描述】:我有 table t1
存储所有请求。我有table t2
,它存储与表 t1 中提出的请求相关的审计。
为了获得每个请求的最新审核,我需要在两个表上执行连接。
我可以使用以下查询执行 JOIN:
SELECT
t2.id, t1.name,
t2.Msg
FROM
requests t1
LEFT JOIN audits t2 ON t1.AuditId = t2.AuditId
ORDER BY t2.id DESC;
上面的查询返回结果如下:
id Name Msg
56895415 ABC05 Message5
56895414 ABC05 Message4
56895413 ABC05 Message3
56895303 ABC04 Message5
56895302 ABC04 Message4
56895301 ABC04 Message3
我想修改查询,以便为每个 t1.name
显示 only the last row(with highest id value)
换句话说,我的输出应该如下:
id Name Msg
56895415 ABC05 Message5
56895303 ABC04 Message5
【问题讨论】:
您在审计表上是否有日期/时间指示器或某种表明 msg5 是最新的行序列? (假设您想要最新的?)table t1
中的id
提供行序列,其中id
的最大值对于每个Name
都有最新消息
【参考方案1】:
几种方法:
下面的语法尚未得到验证:这只是“接近”我的想法。我需要重新创建您的表/数据以进行验证。
为每个 AuditID 获取唯一的最大 ID 并重新加入您的查询:
SELECT
t2.id, t1.name,
t2.Msg
FROM (SELECT max(ID) MID, AuditID
FROM requests
INNER JOIN Audits
GROUP BY AuditID) t3
INNER JOIN requests t1
ON t3.AuditID= T1.AuditID
LEFT JOIN audits t2
ON t1.AuditId = t2.AuditId
AND T3.MID = T2.ID
ORDER BY t2.id DESC;
另一种方法是对每个名称使用 rowNumber 变量,按 ID 降序排序,然后为每个名称仅选择第 1 行。将此用作您的 t2,然后加入。 根据 mysql 的版本,对此的分析将是:
SELECT
t2.id,
t1.name,
t2.Msg
FROM requests t1
LEFT JOIN (Select AuditID, msg, id, row_number() over (partition by AuditID ORDER BY id desc) rn) t2
ON t1.AuditId = t2.AuditId
and RN = 1
ORDER BY t2.id DESC;
但我相信只有 8.0+ 支持这种语法。
【讨论】:
我在使用第一种方法时遇到错误 - 错误代码:14。无法更改文件大小(操作系统 errno 28 - 设备上没有剩余空间)【参考方案2】:您可以像下面这样重写查询
SELECT
t2.id, t1.name,
t2.Msg
FROM
requests t1
LEFT JOIN (SELECT id, Msg FROM audits ORDER BY id DESC LIMIT 1) t2 ON t1.AuditId = t2.AuditId
ORDER BY t2.id DESC;
【讨论】:
我认为这需要使用相关的子查询来获取所有的审计 ID,因为请求可能有审计 1、2、3 等......但是你正在构建的派生表会除非 mysql 支持外部应用,否则只返回 1 行。使用我不知道的左连接。 这不起作用,因为我得到了null
for id
和 Msg
id Name Msg null ABC05 null null ABC04 null
与 JOIN 一起使用时,派生表将充当子查询。它将始终获取该特定 AuditId 的最新记录
@meallhour 你能在这里发布你的查询转储吗?因为它应该工作!以上是关于仅对 MYSQL 中最后返回的行执行 JOIN [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 PDO(使用 MySQL)中执行 INSERT 后获取最后插入的行?