You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取各外键对应最大pk_carid的记录SQL查询问题咨询

解决每个fk_rentid对应最大pk_carid记录的SQL问题

首先咱们先拆解下你原来查询的问题所在:

SELECT c.cardid ,r.rentid ,c.name,
FROM cars AS c
INNER JOIN rent AS r ON r.rentid = c.carid
WHERE (c.carid =(SELECT MAX(c2.carid) Expr1 FROM cars c2 ))
group by r.rentid

这里有几个关键错误:

  • 关联条件错误:Car表用fk_rentid关联Rent表的rentid,应该是r.rentid = c.fk_rentid,而非r.rentid = c.carid,这会导致关联结果完全偏离预期。
  • 子查询逻辑偏差:你写的子查询是取整个Car表的全局最大pk_carid(也就是6),自然只会返回这一条记录,而不是每个fk_rentid分组下的最大值。
  • 语法与分组问题:SELECT末尾多了逗号,且GROUP BY搭配非聚合列的写法在多数数据库中会导致结果不确定。

下面给你两种实用的解决方案:

方案一:窗口函数(推荐,简洁高效)

用ROW_NUMBER()窗口函数可以按fk_rentid分组,给每个分组内的记录按pk_carid降序排号,取排号为1的记录就是每个分组的最大pk_carid条目:

SELECT pk_carid, fk_rentid, name, status
FROM (
    SELECT 
        pk_carid, 
        fk_rentid, 
        name, 
        status,
        ROW_NUMBER() OVER (PARTITION BY fk_rentid ORDER BY pk_carid DESC) AS rn
    FROM Car
) AS ranked_cars
WHERE rn = 1;

这个查询会精准返回你需要的pk_carid为4、5、6的三条记录。如果需要关联Rent表获取更多字段,只需在最后加入JOIN即可:

SELECT c.pk_carid, r.rentid, c.name, c.status
FROM (
    SELECT 
        pk_carid, 
        fk_rentid, 
        name, 
        status,
        ROW_NUMBER() OVER (PARTITION BY fk_rentid ORDER BY pk_carid DESC) AS rn
    FROM Car
) AS ranked_cars
INNER JOIN Rent r ON ranked_cars.fk_rentid = r.rentid
WHERE rn = 1;

方案二:子查询分组+关联(兼容老版本数据库)

如果你的数据库不支持窗口函数(比如老版本MySQL),可以先通过子查询获取每个fk_rentid对应的最大pk_carid,再和原Car表关联:

SELECT c.pk_carid, c.fk_rentid, c.name, c.status
FROM Car c
INNER JOIN (
    SELECT fk_rentid, MAX(pk_carid) AS max_carid
    FROM Car
    GROUP BY fk_rentid
) AS max_cars ON c.fk_rentid = max_cars.fk_rentid AND c.pk_carid = max_cars.max_carid;

同样,需要关联Rent表的话,在这个基础上加入JOIN逻辑即可。

内容的提问来源于stack exchange,提问作者rahul skull

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:45:25