提问人:user1800520 提问时间:10/17/2023 更新时间:10/17/2023 访问量:27
MYSQL 在 3 表联接中选择 MAX Date,按第 1 个表中的 ID 分组
MYSQL Select MAX Date in a 3 table join grouped by the ID in the 1st table
问:
我有三个表,一个名为 BookingDetails 的表,用于存储客户端信息。140,000 条记录
客户参考 | 名字 | 满期 |
---|---|---|
1 | John | 2023-12-17 |
2 | 莎拉 | 2024-06-17 |
3 | 佛瑞德 | 2024-09-10 |
4 | 法案 | 2022-03-11 |
第二个称为 BookingRequest,其中包含客户端发出的请求。83,000 条记录
编号 | 客户参考 |
---|---|
1 | 1 |
2 | 1 |
3 | 2 |
4 | 3 |
5 | 3 |
83000 | 4 |
第三个称为 RequestLog,用于存储每个预订请求的请求状态。110,000 条记录
编号 | 请求 ID | 添加日期 | 地位 |
---|---|---|---|
1 | 1 | 2023-08-17 | 拒绝 |
2 | 1 | 2023-08-18 | 待定 |
3 | 2 | 2023-08-19 | 预订 |
4 | 3 | 2023-09-14 | 待定 |
5 | 4 | 2023-09-19 | 待定 |
6 | 5 | 2023-10-17 | 拒绝 |
110000 | 83000 | 2023-10-18 | 待定 |
我需要查找所有尚未预订的当前客户端,因此我希望执行联接以仅返回按到期日期大于现在的客户端分组的 MAX(状态)。我遇到的问题是客户可以有多个预订请求。如果客户端只有一个请求,我完成的查询可以正常工作,但是如果客户端有一个最新状态为“已预订”的请求,但随后又有另一个最新状态为“待处理”的请求,则它会出现在列表中。我只需要向客户展示他们任何请求的最新状态是“预订”以外的任何状态。
选择 BookingDetails.CustomerRef、BookingDetails.Name、BookingDetails.Expiry、b.Status AS Holidaystatus FROM 预订详情 加入 BookingRequest ON BookingRequest.CustomerRef= BookingDetails.CustomerRef INNER JOIN 请求登录 a.RequestID=BookingRequest.ID JOIN (SELECT MAX(DateAdded) maxdate, RequestID FROM RequestLog GROUP BY RequestID) AS b ON a.RequestID=b.RequestID AND a.DateAdded=b.maxdate WHERE a.Status != 'Booked' AND DATE(BookingDetails.Expiry) > CURDATE() GROUP BY BookingDetails.CustomerRef
我想看到的是
客户参考 | 名字 | 满期 | 地位 |
---|---|---|---|
2 | 莎拉 | 2024-06-17 | 待定 |
3 | 佛瑞德 | 2024-09-10 | 拒绝 |
我所看到的是
客户参考 | 名字 | 满期 | 地位 |
---|---|---|---|
1 | John | 2023-12-17 | 待定 |
2 | 莎拉 | 2024-06-17 | 待定 |
3 | 佛瑞德 | 2024-09-10 | 拒绝 |
答:
您可以使用子查询来识别每个客户端请求的最新状态,然后根据该结果进行筛选。
SELECT
BD.CustomerRef,
BD.Name,
BD.Expiry,
RL.Status AS HolidayStatus
FROM
BookingDetails BD
LEFT JOIN (
SELECT
BR.CustomerRef,
MAX(RL.DateAdded) AS MaxDate
FROM
BookingRequest BR
INNER JOIN RequestLog RL ON BR.ID = RL.RequestID
GROUP BY
BR.CustomerRef
) LatestStatus ON BD.CustomerRef = LatestStatus.CustomerRef
LEFT JOIN BookingRequest BR ON BD.CustomerRef = BR.CustomerRef
LEFT JOIN RequestLog RL ON BR.ID = RL.RequestID
WHERE
LatestStatus.MaxDate IS NULL OR LatestStatus.MaxDate = RL.DateAdded
AND DATE(BD.Expiry) > CURDATE()
AND (RL.Status IS NULL OR RL.Status != 'Booked');
此查询首先创建一个子查询 (LatestStatus) ,以查找为每个客户的请求添加的最长日期。然后,它将 BookingDetails 表与 LatestStatus 子查询和其他必要的表联接起来。
评论
RequestID