有这样一个需求:
有一个用户表,记录了系统中所有的用户信息,班级表记录了用户的班级id,用户的习题提交记录表记录了哪个用户提交就向该表中添加一条该学生的提交记录。
现在的问题是,要查询该班级的学生习题提交情况,就是要查询出来该班级的所有学生,如果习题表里面有该学生的提交记录,那么查询出来该学生的提交信息,没有提交习题的学生提交记录为空。
有点绕。
简单来说,就是左表是学生信息表,右表是学生习题提交记录表。
现在要查询的是左表学生的全部信息,加上右表有已经提交习题的学生的习题信息。
这是一个标标准准的左连接查询,但是问题就是这个查询的where条件应该放在哪。
放在右表中,那么左表不匹配的项将查不出来。但是放在左表中更不行。
按照上面的思路,前提大条件应该是 查询某个班的学生信息,那么再之内的条件就是该班学生的习题提交条件。
分析完这些,就是小条件要加在右表的条件查询语句中,
于是我抱着试试的态度,将右表的筛选条件写在LEFT JOIN 后面,然后就实现了我想要的效果。
如果所示:
完整的SQL如下所示:
SELECT USER.USER_ID , USER.ID_NUMBER, USER.USERNAME, USER.TRUE_NAME, USER.EMAIL, USER.SSEX AS sex, USER.AVATAR, comm.create_time, comm.project_id, comm.score, comm.update_time, comm.is_commit, project.project_name FROM t_user AS `USER` LEFT JOIN t_user_role AS role ON USER.USER_ID = role.USER_ID LEFT JOIN t_user_commit AS comm ON USER.USER_ID = comm.stu_id AND comm.course_id = 2 AND comm.dept_id = 3 AND comm.project_id = 6 AND comm.use_type = 1 AND comm.is_del = 1 LEFT JOIN t_experiment_project AS project ON comm.project_id = project.project_id WHERE role.ROLE_ID = 82 AND USER.is_del = 1 AND USER.`STATUS` = 1 AND USER.DEPT_ID = 3 LIMIT 0, 10