我有四张桌子:
能力:一个明显的能力列表,静态的和一个库
能力水平:指一组相关的能力,并且有许多我正在测试的能力
呼叫能力:记录了指定能力的所有“呼叫”的列表
能力审查状态:证明是否审查了每个呼叫能力
现在我试图编写这个查询来计算总数,并显示出能力、id以及用户是否达到了限制。除了我添加用户之外,一切都正常。我不知道我做错了什么,一旦我在WHERE子句中限制了用户的呼叫能力,我得到了一个小的子集,它只存在于我想要整个能力列表时返回的Call能力。
未达到的能力应为假,记录的适当数字为真。能力表中的完整列表。
我添加了派生表,不确定这是否正确,显然它运行不正常,不确定我做错了什么,我在浪费时间。非常感谢您的帮助。

SELECT comp.id, comp.shortname, comp.description,
       CASE WHEN sum(CASE WHEN crs.grade = 'Pass' THEN 1 ELSE CASE WHEN crs.grade = 'Fail' THEN -1 ELSE 0 END END) >= comp_l.competency_break_level
       THEN TRUE ELSE FALSE END
FROM competencies comp
INNER JOIN competency_levels comp_l  ON comp_l.competency_group = comp.competency_group
LEFT OUTER JOIN (
  SELECT competency_id
  FROM call_competency
  WHERE call_competency.user_id IN (
    SELECT users.id FROM users WHERE email= _studentemail
  )
) call_c ON call_c.competency_id = comp.id
LEFT OUTER JOIN competency_review_status crs ON crs.id = call_competency.review_status_id
GROUP BY comp.id, comp.shortname, comp.description, comp_l.competency_break_level
ORDER BY comp.id;

最佳答案

(从臀部拍摄,无需安装测试)
看起来下面的应该能做到。很明显,有些连接被混淆了,其中一列来自一个未被引用的关系。此外,主查询中的CASE语句可能更简洁。

SELECT comp.id, comp.shortname, comp.description,
       (sum(CASE WHEN crs.grade = 'Pass' THEN 1 WHEN crs.grade = 'Fail' THEN -1 ELSE 0 END) >= comp_l.competency_break_level) AS reached_limit
FROM competencies comp
JOIN competency_levels comp_l USING (competency_group)
LEFT JOIN (
  SELECT competency_id, review_status_id
  FROM call_competency
  JOIN users ON id = user_id
  WHERE email = _studentemail
) call_c ON call_c.competency_id = comp.id
LEFT JOIN competency_review_status crs ON crs.id = call_c.review_status_id
GROUP BY comp.id, comp.shortname, comp.description
ORDER BY comp.id;

10-06 08:51