MYSQL 在 3 表联接中选择 MAX Date,按第 1 个表中的 ID 分组

MYSQL Select MAX Date in a 3 table join grouped by the ID in the 1st table

提问人:user1800520 提问时间:10/17/2023 更新时间:10/17/2023 访问量:27

问:

我有三个表,一个名为 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 拒绝
mysql 连接 最大 maxdate

评论

0赞 P.Salmon 10/17/2023
您希望运行查询的当前日期是什么时候?
0赞 Luuk 10/17/2023
请格式化您的代码....
0赞 Rick James 10/18/2023
我很困惑第二个表中的ID真的吗?请更清楚地说明什么与什么相关联。RequestID

答:

1赞 Amit Mohanty 10/17/2023 #1

您可以使用子查询来识别每个客户端请求的最新状态,然后根据该结果进行筛选。

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 子查询和其他必要的表联接起来。