MYSQL 在按第一个表中的 ID 分组的 3 个表联接中选择最大日期

问题描述 投票:0回答:1

我有三个表,其中一个名为 BookingDetails,用于存储客户信息。 140,000 条记录

客户参考 姓名 到期
1 约翰 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 预订详情 JOIN BookingRequest ON BookingRequest.CustomerRef= BookingDetails.CustomerRef INNER JOIN RequestLog a ON 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 != '已预订' AND DATE(BookingDetails.Expiry) > 库达特() 分组依据 BookingDetails.CustomerRef

我想看到的是

客户参考 姓名 到期 状态
2 莎拉 2024-06-17 待定
3 弗雷德 2024-09-10 拒绝

我所看到的是

客户参考 姓名 到期 状态
1 约翰 2023-12-17 待定
2 莎拉 2024-06-17 待定
3 弗雷德 2024-09-10 拒绝
mysql join max maxdate
1个回答
0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.