我很欣赏那里有许多讲解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

09-26 23:17