首页 > 解决方案 > 高级 SQL 选择查询/动态列

问题描述

我正在学习 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 

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

预期的结果应该是这样的:

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

标签: mysqlsql

解决方案


您可以使用 left join 和 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

演示

table_roomsvisitorsleft join 将根据附加连接条件在没有为 room in 找到关联的情况下生成 null,因为rv.visitor_id = 1它将仅连接table_roomsvisitorsvisitor_id 为 1 的行,而对于其他行,它将返回 null,因此在选择部分中,您可以检查非空行并返回真,空行为假


推荐阅读