在MySQL中找到缺失的值

时间:2010-08-10 11:45:36

标签: sql mysql

我正在尝试编写一个查询,以找出哪些用户未注册某些课程。

我有2张桌子;课程和用户。两者都包含字段'id',然后分别包含'coursename'和username'。

使用这两个表,现有系统将用户添加到第三个表(称为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或NOT 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,在现有系统上我无法修改,只能从​​(目前)查询。

3 个答案:

答案 0 :(得分: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
    )

答案 1 :(得分:0)

只需使用not in和sub select。

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

答案 2 :(得分:0)

如果您要查找特定的单个用户ID,请确保将该ID条件作为WHERE子句的一部分包含在内,否则请将其留空,并且它将为您提供所有未通过所有可能的类注册的人员笛卡尔积(因为没有用户和课程表之间的直接连接)..如果试图为每个人跑步,这可能是非常大/耗时的,你的课程表是100s的课程,其中有人只会参与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 )