如何根据结果值设置具有不同操作的QUERY?

时间:2019-04-23 07:48:10

标签: mysql sql

我需要有关如何设置查询的帮助,该查询将基于在途中实现的结果而导致不同的输出,而我完全陷入困境!

我将为您提供更多详细信息,首先,这是我当前的数据库设置:

#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,但无法真正弄清楚如何进行。非常感谢您的帮助!

3 个答案:

答案 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

Demo on dbfiddle

答案 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