我需要有关如何设置查询的帮助,该查询将基于在途中实现的结果而导致不同的输出,而我完全陷入困境!
我将为您提供更多详细信息,首先,这是我当前的数据库设置:
#USERS
id username etc..
1 alex123
2 bonnie9
3 clyde_x
#COURSES
id course_name visibility etc..
1 Name 1 1
2 Name 2 0
3 Name 3 1
#COURSE_ENROLMENT
id user_id course_id
1 1 1
2 1 2
3 3 1
情况如下。
我需要向注册用户列出课程,这很容易通过以下方式完成:
SELECT
*
FROM COURSES C
JOIN COURSE_ENROLMENT E ON C.ID = E.COURSE_ID
但是。如果将课程可见性(数据库:课程,列:可见性)设置为对所有人可见,则= 1,那么它将覆盖或忽略注册,并向所有用户显示课程。
如何实现这样的目标?我曾尝试研究CASE,但无法真正弄清楚如何进行。非常感谢您的帮助!
答案 0 :(得分:0)
要回答此问题,您将需要使用OR左联接COURSE和COURSE_ENROLLMENT表,因此该人已注册该主题,或可见性设置为0。
答案 1 :(得分:0)
如果将JOIN
更改为LEFT JOIN
,则将为您提供所有课程,无论是否有人注册了这些课程。然后,您可以通过检查visibility = 1
来过滤掉尚未注册任何人并且不可见的课程:
SELECT *
FROM Courses C
LEFT JOIN Course_Enrolment E ON C.id = E.course_id
WHERE C.visibility = 1 OR E.id IS NOT NULL
输出:
id course_name visibility id user_id course_id
1 Name 1 1 1 1 1
2 Name 2 0 2 1 2
1 Name 1 1 3 3 1
3 Name 3 1 null null null
答案 2 :(得分:0)
如果visibility=1
意味着将为所有用户返回该课程,则可以针对这种情况和UNION ALL进行交叉联接:
select c.course_name, u.username
from users u
inner join course_enrolment e on e.user_id = u.id
inner join (
select * from courses where visibility = 0
) c on c.id = e.course_id
union all
select c.course_name, u.username
from users u
cross join (
select * from courses where visibility = 1
) c
order by course_name, username