如何从assigns等多表查询中获取数据库最新条目?
解决思路与修改后的查询语句
你的问题很典型——直接关联多表后分组,只会随机返回匹配的第一条记录,而不是你想要的最新条目。核心要做的是先为每辆车锁定它的最新加油记录(fuel)和最新分配记录(assigns),再关联其他表获取完整信息。
修改后的查询语句
SELECT v.vname, v.year, v.make, v.model, v.vid, v.fueltype, f.fID, f.meter, f.date, a.driverID, a.dateassigned, u.uid, u.name, u.surname FROM vehicles v -- 先找到每辆车的最新加油记录 INNER JOIN ( SELECT vID, MAX(date) AS latest_fuel_date FROM fuel GROUP BY vID ) latest_fuel ON v.vid = latest_fuel.vID INNER JOIN fuel f ON f.vID = latest_fuel.vID AND f.date = latest_fuel.latest_fuel_date -- 再找到每辆车的最新分配记录 INNER JOIN ( SELECT vID, MAX(dateassigned) AS latest_assign_date FROM assigns GROUP BY vID ) latest_assign ON v.vid = latest_assign.vID INNER JOIN assigns a ON a.vID = latest_assign.vID AND a.dateassigned = latest_assign.latest_assign_date -- 关联司机信息 INNER JOIN users u ON a.driverID = u.id ORDER BY f.date DESC;
为什么这样改?
- 子查询
latest_fuel按车辆ID分组,用MAX(date)拿到每辆车的最新加油日期,再通过这个日期关联fuel表,确保拿到的是该车辆的最新加油记录 - 同理,
latest_assign子查询锁定每辆车的最新分配日期,关联assigns表获取最新的司机分配信息 - 用
INNER JOIN只会返回既有加油记录又有分配记录的车辆,如果需要包含没有这些记录的车辆,把INNER JOIN换成LEFT JOIN即可(对应字段会显示为NULL) - 最后按加油日期倒序排列,最新的记录会排在最前面
内容的提问来源于stack exchange,提问作者Kingsley
相关产品推荐
相关产品推荐

