MySQL SUM () INNER JOIN 和 LIMIT 使用 FOREIGN KEY

Posted

技术标签:

【中文标题】MySQL SUM () INNER JOIN 和 LIMIT 使用 FOREIGN KEY【英文标题】:MySQL SUM () INNER JOIN AND LIMIT using FOREIGN KEY 【发布时间】:2021-01-18 20:30:24 【问题描述】:

我有以下表格: 车辆:

    VID 主键 Reg_no 日期 初始里程

里程

    MID 主键 Reg_no 外键 日期 Miles_covered To_service 总计

我想要的是对里程表中外键的最后一行求和(总计)。

在这种情况下,查询求和 MID 7 和 MID 19

我尝试过的:

    SELECT SUM(Mileage.Total) Totals 
    FROM (
        SELECT * 
        FROM Mileage 
        INNER JOIN Vehicles on Mileage.Registration_No=Vehicles.Registration_No 
        ORDER BY Mileage.MID DESC Limit 1
    ) SUB 
    ORDER BY Mileage.MID ASC;

我收到错误 1060

我做错了什么,我该怎么做?

【问题讨论】:

请以文字形式发布表格数据,而不是图片。 "我想要的是对里程表中最后一行外键求和(Total)..." -- 你如何定义最后一行?由于存在重复值,因此日期不够好。 另外请发布错误描述。没有人记得所有的错误代码 您使用了短语last row。问题是,SQL 表是无序的行集。除非您指定它们,否则不存在 first 和 last 的概念。 最后一行是什么意思?具有最大 MID 主键的那个?日期?里程?请edit您的问题。 【参考方案1】:

您可以使用子查询进行过滤,然后进行聚合。假设mid可以作为排序列:

select sum(m.total) sum_total
from mileage m
where m.mid = (
    select max(m1.mid) from mileage m1 where m1.registration_no = m.registration_no
)

这适用于所有版本的 mysql,并且应该是一个有效的解决方案,前提是您在 (registration_no, mid) 上有一个索引。

请注意,您不需要vehicle 表来获得您想要的结果。

【讨论】:

【参考方案2】:

如果您通过最大 MID 值查找“最后一行”,那么您的查询可能如下所示:

select sum(total) as totals 
from (
  select m.total,
    row_number() over(partition by m.registration_no 
                      order by m.mid desc) as rn
  from mileage m
  join vehicles v on v.registration_no = m.registration_no
) sub
where sub.rn = 1

【讨论】:

【参考方案3】:

如果您想保留车辆表中的所有信息,您也可以这样做

SELECT V.*, COALESCE(SUM(M.Total),0) AS ToTal_Last_Mileage
FROM Vehicles V
INNER JOIN
(
    SELECT Reg_no, MAX(MID) AS MAxID
    FROM Mileage 
    GROUP BY Reg_no
) MG ON  V.Reg_no=MG.Reg_no
INNER JOIN Mileage M ON MG.MaxID=M.MID

应该适用于 MySQL 版本

【讨论】:

以上是关于MySQL SUM () INNER JOIN 和 LIMIT 使用 FOREIGN KEY的主要内容,如果未能解决你的问题,请参考以下文章

来自第二个表的 MySQL INNER JOIN (TOP10)

INNER JOIN 改变 SUM 结果

来自INNER JOIN的Django SUM

尝试将 INNER JOIN 和 GROUP BY SQL 与 SUM 函数一起使用,但不工作

MySQL中inner join 和 cross join 的区别

mysql 里面JOIN 和 INNER JOIN 区别是啥