MySQL SUM () INNER JOIN AND LIMIT using FOREIGN KEY

MySQL SUM () INNER JOIN AND LIMIT using FOREIGN KEY

我有以下 table: 车辆:

  1. VID 主键
  2. Reg_no
  3. 日期
  4. Initial_mileage

里程

  1. MID 主键
  2. Reg_no 外键
  3. 日期
  4. Miles_covered
  5. To_service
  6. 总计

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

在这种情况下,查询求和 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

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

如果您通过最大 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

您可以使用子查询进行过滤,然后进行聚合。假设 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 table 来获得您想要的结果。

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

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 个版本