我正在尝试编写一个查询,以找出哪些用户没有注册某些课程。
我有两个表:课程和用户。两者都包含字段'id‘,然后分别包含'coursename’和‘username’字段。
使用这两个表,现有系统将用户添加到第三个表(称为enrolled_users)。用户每行占一行。例如,如果用户id '1‘在4门课程中,则enrolled_users如下所示:
-----------------------
| user_id | course_id |
-----------------------
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 1 | 4 |
-----------------------正如您可以看到的,该表数据不是基于关系构建的,它是在PHP中使用两个表'courses‘和'users’生成的。
如果有10门课程,我不知道如何查询用户'1‘没有注册的课程,但我们可以看到用户'1’只在课程1-4上。
我应该用像或不像这样的东西吗?
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,在现有的系统上我不能修改,只能从(目前)查询。
发布于 2010-08-10 19:59:01
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
)发布于 2010-08-10 19:53:04
只需使用not in和sub select。
select * from courses c where c.id not in
(select course_id from enrolled_courses where user_id='1') 发布于 2010-08-10 19:53:51
如果要查找特定的单个用户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 )https://stackoverflow.com/questions/3448544
复制相似问题