选择MYSQL记录,其中缺少集合中的子记录

时间:2014-10-23 08:30:07

标签: mysql

在这种情况下:如果有人选修一门课程,他们必须参加一系列其他课程作为补充。我怎样才能确定学生尚未参加的课程?

以下是我的表格:

tbl_course_dependency_lookup
courseid    dependentid
133          57
133          55
133          71
167          57
167          99

tbl_user_course_completed
userid      courseid
 12         133
 12          55
 13          71
 14         133
 15         100

以下是应该返回的数据:

userid      courseid      dependentid
12          133           57
12          133           71
14          133           55
14          133           57
14          133           71

1 个答案:

答案 0 :(得分:1)

 DROP TABLE IF EXISTS course_dependency;

 CREATE TABLE course_dependency
 (course_id    INT NOT NULL
 ,dependent_id INT NOT NULL
 ,PRIMARY KEY(course_id,dependent_id)
 );

 INSERT INTO course_dependency VALUES
 (133          ,57),
 (133          ,55),
 (133          ,71),
 (167          ,57),
 (167          ,99);

 DROP TABLE IF EXISTS user_course;

 CREATE TABLE user_course
 (user_id INT NOT NULL
 ,course_id INT NOT NULL
 ,PRIMARY KEY(user_id,course_id)
 );

 INSERT INTO user_course VALUES
 (12         ,133),
 (12          ,55),
 (13          ,71),
 (14         ,133),
 (15         ,100);

 SELECT uc.* 
      , cd.dependent_id 
   FROM user_course uc 
   JOIN course_dependency cd 
     ON cd.course_id = uc.course_id 
   LEFT 
   JOIN user_course ucx 
     ON ucx.user_id = uc.user_id 
    AND ucx.course_id = cd.dependent_id 
  WHERE ucx.user_id IS NULL;

 +---------+-----------+--------------+
 | user_id | course_id | dependent_id |
 +---------+-----------+--------------+
 |      12 |       133 |           57 |
 |      12 |       133 |           71 |
 |      14 |       133 |           55 |
 |      14 |       133 |           57 |
 |      14 |       133 |           71 |
 +---------+-----------+--------------+