SQL COUNT返回错误的数字

时间:2017-01-17 01:08:03

标签: mysql sql-server

所以我的查询有问题。我有2张桌子:

课程:

此表中的user_id是课程的讲师。

-----------------------------------------------------------------------
| course_id   |    user_id    |   course_name     | other information |
-----------------------------------------------------------------------
| 6           |       1       |   My Course 1     | ...               |
-----------------------------------------------------------------------

my_courses:

此表中的user_id是该课程的学生。

--------------------------------------------------
| user_id     | course_id  | created_at          |
--------------------------------------------------
| 5           | 6          | [UNIX_TIMESTAMP]    |
--------------------------------------------------

my_courses包含已加入该课程的人数。我想获得所有课程信息以及加​​入课程的人数。除了加入课程的人数外,一切都按预期返回。这是我使用的查询:

        SELECT 
            courses.*,
            users.name, //This is the name of the instructor
            users.last_name, //This is the last name of the instructor
            COUNT(my_courses.user_id) as count_students

        FROM courses

        LEFT JOIN users
        ON courses.user_id = courses.user_id

        LEFT JOIN my_courses
        ON courses.course_id = my_courses.course_id

        WHERE courses.course_id = '6'

就像我说的那样,此查询会返回正常的课程信息,但只返回3作为count_students时,它应该只返回1。有谁知道为什么会这样?任何帮助是极大的赞赏。

2 个答案:

答案 0 :(得分:1)

这可能是因为JOIN的{​​{1}}条件。它应该是:

users

您还应在查询中添加LEFT JOIN users ON courses.user_id = users.user_id 子句:

GROUP BY

此外,为您的表添加别名以提高可读性。

答案 1 :(得分:1)

JOIN操作导致行的组合乘法。您需要从自己的表中总结学生人数。

                      SELECT course_id, COUNT(*) students
                        FROM my_courses
                    GROUP BY course_id

这为您提供了每个course_id有一行或零行的结果集。然后,您可以将其加入查询的其余部分。

SELECT courses.*,
       users.name, //This is the name of the instructor
       users.last_name, //This is the last name of the instructor
       aggr.count_students
  FROM courses
  LEFT JOIN users  ON courses.user_id = courses.user_id
  LEFT JOIN (
                 SELECT course_id, COUNT(*) students
                   FROM my_courses
                GROUP BY course_id
       ) aggr ON courses.course_id = aggr.course_id
 WHERE courses.course_id = '6'

通过这种方式,您可以避免多次计算您的学生参加可能超过一名教师的课程。