MYSQL - 为每条记录选择最近的日期(相关子查询)
MYSQL - Selecting the most recent date for each record (correlated subqueries)
我有一个 mysql 查询,我想在其中获取:
- 车辆使用日期的最近服务(从维修中获得 table)(任何不是 'None' 来自 serviceType 的都表示它是一项服务)
- 和最近的车辆计数器使用日期(从车辆加油获得table)
在一条记录中,每条记录都有一个车辆 ID。数据是从 2 个不同的 table 中获得的,同时在子查询中按车辆 ID 对它们进行分组。
SELECT
r.vehicleCounter AS lastServiceCounter,
vf.vehicleCounter AS currentCounter,
r.dateFinished,
r.type,
v.vehicleID
FROM vehicle AS v
LEFT JOIN (
SELECT r.repairID,
r.vehicleCounter,
r.dateFinished,
st.type,
r.vehicleID
FROM repair AS r
INNER JOIN servicetype AS st
ON st.serviceTypeID = r.serviceTypeID
WHERE st.type <> 'None'
AND r.dateFinished IN (
SELECT MAX(dateFinished)
FROM repair
GROUP BY vehicleID
)
) AS r
ON r.vehicleID = v.vehicleID
LEFT JOIN (
SELECT vehicleCounter, vehicleID
FROM vehiclefueling
WHERE date IN(
SELECT MAX(date)
FROM vehicleFueling
GROUP BY vehicleID
)
) AS vf ON vf.vehicleID = v.vehicleID
虽然 运行 这个查询我应该只有每个 ID 的记录,但目前查询返回相同的 ID,但记录的值不同(检查 ID 11):
我可以对主查询使用 GROUP BY vehicleID,但我想保留最新的值
我会使用相关子查询获取维修和加油 ID:
select v.*,
(select r.repairId
from repairs r
where r.vehicleID = v.vehicleID
order by r.datefinished desc
limit 1
) as repairid,
(select vh.vehiclefuelingId
from vehiclefueling vh
where vh.vehicleID = v.vehicleID
order by vh.date desc
limit 1
) as vehiclefuelingId
from vehicle v;
然后,您可以重新连接两个表以获取其他字段。
这应该会让您对如何解决问题有所了解。您的示例查询包含不直接适合您的问题的其他表和逻辑。
我有一个 mysql 查询,我想在其中获取:
- 车辆使用日期的最近服务(从维修中获得 table)(任何不是 'None' 来自 serviceType 的都表示它是一项服务)
- 和最近的车辆计数器使用日期(从车辆加油获得table)
在一条记录中,每条记录都有一个车辆 ID。数据是从 2 个不同的 table 中获得的,同时在子查询中按车辆 ID 对它们进行分组。
SELECT
r.vehicleCounter AS lastServiceCounter,
vf.vehicleCounter AS currentCounter,
r.dateFinished,
r.type,
v.vehicleID
FROM vehicle AS v
LEFT JOIN (
SELECT r.repairID,
r.vehicleCounter,
r.dateFinished,
st.type,
r.vehicleID
FROM repair AS r
INNER JOIN servicetype AS st
ON st.serviceTypeID = r.serviceTypeID
WHERE st.type <> 'None'
AND r.dateFinished IN (
SELECT MAX(dateFinished)
FROM repair
GROUP BY vehicleID
)
) AS r
ON r.vehicleID = v.vehicleID
LEFT JOIN (
SELECT vehicleCounter, vehicleID
FROM vehiclefueling
WHERE date IN(
SELECT MAX(date)
FROM vehicleFueling
GROUP BY vehicleID
)
) AS vf ON vf.vehicleID = v.vehicleID
虽然 运行 这个查询我应该只有每个 ID 的记录,但目前查询返回相同的 ID,但记录的值不同(检查 ID 11):
我可以对主查询使用 GROUP BY vehicleID,但我想保留最新的值
我会使用相关子查询获取维修和加油 ID:
select v.*,
(select r.repairId
from repairs r
where r.vehicleID = v.vehicleID
order by r.datefinished desc
limit 1
) as repairid,
(select vh.vehiclefuelingId
from vehiclefueling vh
where vh.vehicleID = v.vehicleID
order by vh.date desc
limit 1
) as vehiclefuelingId
from vehicle v;
然后,您可以重新连接两个表以获取其他字段。
这应该会让您对如何解决问题有所了解。您的示例查询包含不直接适合您的问题的其他表和逻辑。