gpt4 book ai didi

mysql - 一个 LEFT JOIN 的 4 表查询

转载 作者:行者123 更新时间:2023-11-30 21:27:43 42 4
gpt4 key购买 nike

我正在开发一个应用程序来帮助我平衡加类时间。我需要检索在给定时间段 (OT_Shift.OT_PeriodID=4) 内满足特定条件 (Staff.OT_Eligibility=1) 的所有员工的列表,以及他们在该时间段内提供的类次总数.以下查询提取了正确的结果,但不包括提供的总类次为 0 的任何员工。

我遇到的问题是我需要在查询中返回的列被两个中间表分隔开。对于 OT 的每个类次,都有多个符合条件的工作人员,并且每个有资格参加该类次的工作人员可能有 7 个不同的响应代码之一(每个都分配了不同的值来计算均衡)。这会强制建立来自 Staff->OT_Shift->OT_Shift_Roster->OT_Response 的关系。

我已经尝试在每个 JOIN 语句中包含“LEFT JOIN”,希望它可能只是以相反的顺序求值并且不会改变结果集。

SELECT 
s.Staff_ID,
s.LastName,
sum(ResponseValue) AS Shift_Count
FROM Staff s
LEFT JOIN OT_Shift_Roster sr
ON s.Staff_ID=sr.RosterID
JOIN OT_Response otr
ON sr.Response=otr.OT_Response_ID
JOIN OT_Shift ots
ON sr.ShiftID=ots.Shift_ID
WHERE
s.OT_Eligibility = 1 AND ots.OT_PeriodID=4
GROUP BY s.Staff_ID

我得到了以下信息,但我缺少大约 20 名在“Shift_Count”字段中有 0 的员工。

# Staff_ID, LastName, Shift_Count
3, Kantner, 1
10, Wells, 2
12, Moore, 1
46, Denomy, 1
48, Costanzo, 1
49, George, 2
50, Schusterman, 2
51, O'Connor, 1
55, McLeod, 2
59, Potter, 1
69, Tristan, 1
75, Gardull, 1
77, Weis, 1
106, Thomasson, 1
107, Lehmann, 1

最佳答案

您需要将所有依赖于 LEFT JOINed 表的 JOIN 转换为 LEFT JOINse 到 ON JOIN 子句。 COALESCE()(或 RDBMS 上的类似方法)可用于在 中没有记录匹配时返回 0 而不是 NULL >左连接

SELECT 
s.Staff_ID,
s.LastName,
COALESCE(SUM(ResponseValue), 0) AS Shift_Count
FROM Staff s
LEFT JOIN OT_Shift_Roster sr
ON s.Staff_ID=sr.RosterID
LEFT JOIN OT_Response otr
ON sr.Response=otr.OT_Response_ID
LEFT JOIN OT_Shift ots
ON sr.ShiftID=ots.Shift_ID AND ots.OT_PeriodID=4
WHERE
s.OT_Eligibility = 1
GROUP BY s.Staff_ID

基本原理:WHERE 子句中的条件必须对每条记录都满足。但是当 LEFT JOIN 出现空的时候,条件就不能满足,违规记录就会从结果集中被逐出。换句话说,在 WHERE 子句中对 LEFT JOINed 表设置条件会隐式地将其转换为 INNER JOIN。相同的逻辑适用于依赖于 LEFT JOINed 表的 INNER JOIN

关于mysql - 一个 LEFT JOIN 的 4 表查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58071181/

42 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com