Как настроить QUERY с различными действиями, основанными на значении результата? - PullRequest
0 голосов
/ 23 апреля 2019

Мне нужна помощь в настройке ЗАПРОСА, который будет приводить к различным выводам, в зависимости от результатов, которых он достигает в пути, и я полностью застрял!

Я дам вам более подробную информацию, прежде всего, вот мои текущие настройки базы данных:

#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 голосов
/ 23 апреля 2019

Если вы измените свой 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

Демонстрация на dbfiddle

0 голосов
/ 23 апреля 2019

Если 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
0 голосов
/ 23 апреля 2019

Чтобы ответить на этот вопрос, вам нужно будет ВЛЕВО присоединиться к вашим таблицам COURSE и COURSE_ENROLLMENT, используя ИЛИ, так что либо лицо зарегистрировано в теме, либо видимость установлена ​​на 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...