【问题标题】:Mysql count with multiple left join具有多个左连接的Mysql计数
【发布时间】:2013-12-10 11:02:47
【问题描述】:

我在使用 mysql 查询检索计数记录时确实遇到了麻烦。这是场景。我想获取包含未出现在 selected_students 表中的学生人数的主表(标准)行。

criteria
---------
id  name
1   maths
2   medicine
3   physics

criteria_matches
------------------
id  criteria_ref_id   user_ref_id
1          1            153
2          1            222
3          1            699
4          2            486
5          2            38
6          3            141

selected_students
-----------------
id  user_ref_id  selected_by  status
1        153        15     'E'
2        500        15     'E'
3        486        15     'E'
3        141        15     'E'



expected result
----------------
criteria_id criteria_name   student_count
1               maths       2
2               medicine    1
3               physics     0

我尝试使用以下查询来获取具有计数但没有运气的父表行

SELECT t.id, t.name, COUNT(DISTINCT ss.user_ref_id) AS students_count FROM criteria t  
LEFT JOIN criteria_matches cm ON cm.criteria_ref_id = t.id
LEFT JOIN selected_students ss ON ss.user_ref_id = cm.user_ref_id
WHERE dss.user_ref_id IS NULL
GROUP BY t.id ORDER BY t.name

【问题讨论】:

    标签: mysql count null left-join


    【解决方案1】:

    您需要从criteria_matches 表中计算user_ref_id,而不是从selected_students(由于WHERE 子句中的过滤器*,后者将始终为NULL,因此是COUNT()永远是 0):

    SELECT   t.id, t.name, COUNT(DISTINCT cm.user_ref_id) AS students_count
    FROM     criteria t  
      LEFT JOIN criteria_matches  cm ON cm.criteria_ref_id = t.id
      LEFT JOIN selected_students ss ON ss.user_ref_id     = cm.user_ref_id
    WHERE    ss.user_ref_id IS NULL
    GROUP BY t.id
    ORDER BY t.name
    

    sqlfiddle 上查看。


    * 注意:您问题中的WHERE 子句错误地引用了未定义的表别名dss。我假设您打算引用 selected_students 表的 ss 别名。

    【讨论】:

    • 非常感谢,你太棒了
    • 哦不,我只是编辑了小提琴脚本,结果不包括所有主表行。 sqlfiddle.com/#!2/c70e6/1
    • @sam:您要么需要在criteria 表中包含ss.user_ref_id IS NULL within the outer join 的过滤条件;否则refactor 使用(效率较低但更清晰)子查询。
    • 谢谢,我会用外连接
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    • 2010-12-31
    • 1970-01-01
    相关资源
    最近更新 更多