расширенный запрос выбора SQL / динамические столбцы - PullRequest
0 голосов
/ 26 июня 2018

Я склоняюсь к MySQL, но борюсь с более сложными запросами, поэтому я надеюсь, что кто-то сможет пролить свет

У меня есть следующая база данных (надеюсь, она правильно отформатирована)

table_visitors
visitor_id | visitor_name
   1       |       Joe
   2       |       Bob

table_rooms
room_id | room_name
    1   |  room 1
    2   |  room 2 
    3   |  room 3
    4   |  room 4

table_roomsvisitors (indicates which visitors can access which rooms)
visitor_id | room_id
    1      |    1
    1      |    2
    1      |    3
    2      |    1
    2      |    4 

Я бы хотел перечислить (для конкретного посетителя) каждый элемент таблицы_в комнатах, а также, если выбранный посетитель имеет доступ к каждой комнате

Ожидаемый результат должен быть примерно таким:

query for Joe:
room_name | access
 room 1   | true
 room 2   | true
 room 3   | true
 room 4   | false

query for Bob:
room_name | access
 room 1   | true
 room 2   | false
 room 3   | false
 room 4   | true

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Вы можете использовать CROSS JOIN:

select v.visitor_name, r.room_name, 
       (case when rv.visitor_id is null then 'false' else 'true' end) as access
from table_visitors v cross join 
     table_rooms r left join
     table_roomsvisitors  rv 
     on rv.visitor_id = v.visitor_id and rv.room_id = r.room_id
where v.visitor_name = 'Joe';
0 голосов
/ 26 июня 2018

присоединились к таблицам, а затем использовали регистр для true и false. Тогда идентификатор зависит от того, кто, так как вы сказали запрос для Боба и один для Джо

Для Джо:

select tr.room_name, case when rv.visitor_id is not null then 'true' else 'false' end access from table_rooms tr
left join table_roomvisitors rv on tr.room_id = rv.room_id
where rv.visitor_id = 1

Для Боба:

select tr.room_name, case when rv.visitor_id is not null then 'true' else 'false' end access from table_rooms tr
left join table_roomvisitors rv on tr.room_id = rv.room_id
where rv.visitor_id = 2
0 голосов
/ 26 июня 2018

Вы можете использовать левый оператор соединения и регистра, чтобы проверить, имеет ли пользователь доступ к комнате

select r.room_name, 
       case when rv.visitor_id is not null then true else false end access
from table_rooms r
left join table_roomsvisitors rv on r.room_id = rv.room_id
and rv.visitor_id = 1

демо

при левом соединении будет нулевое значение, если для комнаты в table_roomsvisitors не найдена ассоциация на основе дополнительного условия объединения как rv.visitor_id = 1, которое будет объединять только строки из table_roomsvisitors, где visitor_id равен единице, а для других строк оно будет возвращать нулевое значение таким образом, в выделенной части вы можете проверить наличие ненулевых строк и вернуть true, false для нулевых строк

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