获取各外键对应最大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
相关产品推荐
相关产品推荐

