我有三个表,其中一个名为 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 | 拒绝 |
您可以使用子查询来识别每个客户端请求的最新状态,然后根据该结果进行过滤。
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 子查询和其他必要的表连接起来。