2010-08-10 38 views
1

我正在尝试编写一个查询来查明哪些用户没有注册某些课程。在MySQL中查找缺失值

我有2个表;课程和用户。两者分别包含字段'id'和'coursename'和用户名'。

使用这两个表,现有系统将用户添加到第三个表(称为enrolled_users)。用户每占用一行。例如,如果用户ID“1”是在4个疗程enrolled_users看起来是这样的:

----------------------- 
| user_id | course_id | 
----------------------- 
|  1 |  1  | 
|  1 |  2  | 
|  1 |  3  | 
|  1 |  4  | 
----------------------- 

正如你可以看到这个表中的数据不是建立在一个关系,它使用的是两个表“课程在PHP中生成'和'用户'。

我不知道如何编写一个关于如何找出课程的查询用户'1'没有注册,如果有说10门课程,但我们可以看到用户'1'只在课程1- 4。

我想要使用像LIKE或不喜欢的东西吗?

SELECT u.id, c.id, ec.user_id, ec.course_id 
FROM users u, courses c, enrolled_courses ec 
WHERE u.id = ec.user_id 
AND c.id = ec.course_id 
AND u.id = '1' 

我已经尝试使用=和<>但是,这并不表明我需要什么!;用户没有注册的课程列表。

对不起,如果我是模糊的,试图让我的头!

在现有系统上使用MySQL 5.0,我无法修改,只能从​​(目前)查询。

+0

的想法是做左的连接,并添加其中course.id为空 – 2010-08-10 11:51:52

回答

5
SELECT 
    * 
FROM 
    courses c 
WHERE 
    c.id NOT IN (
    SELECT 
     ec.course_id 
    FROM 
     enrolled_courses ec 
    WHERE 
     ec.user_id = 1 AND ec.course_id IS NOT NULL 
    ) 
+0

谢谢,这是完美的 – Mathnode 2010-08-10 13:03:17

0

只要使用一个不在和子选择。

select * from courses c where c.id not in 
    (select course_id from enrolled_courses where user_id='1') 
+0

写的概念,但用户表中没有一门课程的ID ......这是什么enrolled_courses是为 – DRapp 2010-08-10 11:56:13

+0

难道不是如果你在参加的课程中替代,这是否一样? – Nix 2010-08-10 12:04:32

+0

干杯尼克斯,它做到了: 'SELECT * from courses c WHERE c.id NOT IN (SELECT course_id from enrolled_courses WHERE user_id ='1')' – Mathnode 2010-08-10 13:02:56

0

如果你正在寻找一个特定的单一用户ID,一定要包括该ID的条件作为WHERE子句的一部分,否则,将其留空,它会给你们谁也注册了所有的人所有可能的类都通过笛卡尔产品(因为用户和课程表之间没有直接联系)..如果试图为所有人运行,这可能非常大/耗时,而您的课程表是100人的课程,其中有人只参与2 -3-4课程。

select 
     u.id, 
     c.id CourseID 
    from 
     users u, 
     courses c 
    where 
      u.id = 1 
     AND c.id NOT IN 
      (select ec.Course_ID 
       from enrolled_courses ec 
       where ec.user_id = u.id)