所以我的查询有问题。我有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
。有谁知道为什么会这样?任何帮助是极大的赞赏。
答案 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'
通过这种方式,您可以避免多次计算您的学生参加可能超过一名教师的课程。