我很欣赏那里有许多讲解JOIN概念的教程和示例,但是我正在努力将这些示例应用于我的特定场景。我将不胜感激,希望能对您有所帮助,请您对解决方案中发生的事情进行分解,以取得所需的结果。
3个表:用户,评估,评估日志。
使用者
+--------+------+------+-----------+----------+-----------+-------+--------+-----------+---------------+------+----------+
| UserID | User | Pass | FirstName | LastName | LastLogin | Email | Mobile | Kenitalla | AccountStatus | Role | Operator |
+--------+------+------+-----------+----------+-----------+-------+--------+-----------+---------------+------+----------+
评估
+--------------+------+-----------+-----------+-----------+-----------+-----------+--------------+----------+---------+----------+
| AssessmentID | Name | Criteria1 | Criteria2 | Criteria3 | Criteria4 | Criteria5 | RoleRequired | Required | Renewal | Operator |
+--------------+------+-----------+-----------+-----------+-----------+-----------+--------------+----------+---------+----------+
评估日志
+-----------------+------+----------------+------------+--------+-----------+----------+----------+----------+----------+----------+----------+---------+---------------+---------+
| AssessmentLogID | Date | AssessmentName | AssessedBy | UserID | StaffName | Comments | Verdict1 | Verdict2 | Verdict3 | Verdict4 | Verdict5 | Verdict | RenewalPeriod | NextDue |
+-----------------+------+----------------+------------+--------+-----------+----------+----------+----------+----------+----------+----------+---------+---------------+---------+
当用户进行评估时,条目将进入评估日志。某些评估是必需的(“必需”列中为是或否),而另一些则是可选的。 RoleRequired列规定了需要评估的用户角色。
我想生成一个用户列表和他们尚未通过的评估。必须要求评估,并且所需角色必须与用户角色匹配。在Verdict列中缺少带有“ Pass”的评估日志条目,表示评估尚未通过。
简而言之,我正在寻找一个将实现以下结果的查询:
+------------------+-----------------+----------------+
| assessments.Name | users.FirstName | users.LastName |
+------------------+-----------------+----------------+
在需要评估的情况下(Required等于true),RequiredRole与users.Role列匹配,并且在Assessments_log中没有用于评估的条目,其中Verdict列具有“通过”值。
如果需要进一步说明,请告诉我。
提前致谢!
最佳答案
我建议使用左联接。
首先,我们生成评估和用户的交叉产品,其中包含每个用户的角色所需的所有评估。
然后,左联接检查这些评估是否通过。
SELECT ...
FROM
users u
JOIN assessments a ON (a.RoleRequired = u.Role)
LEFT JOIN assessment_logs al ON (
al.AssessmentID = a.AssessmentID
AND al.UserID = u.UserID
AND al.Verdict='Pass'
)
WHERE
a.required
AND al.UserID IS NULL