高级SQL选择查询/动态列

时间:2018-06-26 18:48:10

标签: mysql sql

我倾向于使用MySQL,但仍在尝试更高级的查询,因此我希望有人可以对此有所了解

我有以下数据库(希望它的格式正确)

0x1B

如果允许所选访问者访问每个房间,我还要列出(针对特定访问者)table_rooms中的每个项目

预期结果应该是这样的:

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 

3 个答案:

答案 0 :(得分:0)

您可以使用左连接和case语句检查用户是否有权访问会议室

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

demo

左联接将根据其他联接条件table_roomsvisitorsrv.visitor_id = 1中没有空间的地方产生null,它将仅联接table_roomsvisitors中visitor_id为1的行。其他行将返回null,因此在选择部分中,您可以检查不为空的行,并为空行返回true,false

答案 1 :(得分:0)

您使用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';

答案 2 :(得分:0)

加入表,然后使用true和false的大小写。那么,该ID取决于谁,因为您说了bob查询和joe查询

对于乔:

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