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

我有以下表格: 车辆:

  1. VID 主键
  2. Reg_no
  3. 日期
  4. 初始里程

里程

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

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

在这种情况下,查询求和 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您的问题。

标签: mysql sum subquery inner-join greatest-n-per-group


【解决方案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 版本

      【讨论】:

        猜你喜欢
        • 2014-07-27
        • 1970-01-01
        • 2010-10-06
        • 1970-01-01
        • 2017-09-12
        • 2018-05-10
        • 1970-01-01
        • 2021-05-14
        • 2021-08-07
        相关资源
        最近更新 更多