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 和 GROUP BY SQL 与 SUM 函数一起使用,但不工作