仅对 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 idMsg id Name Msg null ABC05 null null ABC04 null 与 JOIN 一起使用时,派生表将充当子查询。它将始终获取该特定 AuditId 的最新记录 @meallhour 你能在这里发布你的查询转储吗?因为它应该工作!

以上是关于仅对 MYSQL 中最后返回的行执行 JOIN [重复]的主要内容,如果未能解决你的问题,请参考以下文章

在 PDO(使用 MySQL)中执行 INSERT 后获取最后插入的行?

mysql中inner join和outer join有啥区别?

MySql join on 和 where

sql(join on 和where的执行顺序)

sql(join on 和where的执行顺序)

sql(join on 和where的执行顺序)