我正在尝试编写一个查询,以找出哪些用户未注册某些课程。
我有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,在现有系统上我无法修改,只能从(目前)查询。
答案 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 )