我认为这是一个简单的SQL查询问题,但我对不同的SQL连接类型不够熟悉,无法获得此问题的最佳解决方案。
我有一个管理这些项目的各种items
和owners
的系统。如果用户有权查看该所有者,则user
系统有权查看有关项目和所有者的所有者的所有信息。我的架构如下:
Users:
| UserId |
Items:
| ItemId | OwnerId | Name | Age |
Owners:
| OwnerId | FirstName | LastName | State |
OwnerPermissions:
| UserId | OwnerId |
Item可能没有所有者 - 那么Items表中的那行的OwnerId为NULL。
因此,如果在OwnerPermissions
中存在UserId = 0且OwnerId = 0且OwnerId = 1的条目,则UserId = 0可以查看OwnerId 0和1拥有的所有项目信息。
我想写一个给定userId的查询,它返回用户有权查看的所有者的所有项目和所有者信息,并显示所有没有所有者的项目 < / p>
查询:
select Items.*, Owners.*
from Items
inner join Owners on Items.OwnerId = Owners.OwnerId
inner join OwnerPermissions on OwnerPermissions.OwnerId = Owners.OwnerId
where OwnerPermissions.UserId = $userId
获取我有权查看的人拥有的所有项目信息,但它错过了不属于任何人的项目(OwnerId为NULL)。
编写此查询的最佳方法是什么?我使用的是SQL Server,但我更喜欢不依赖它的答案(但如果有一个SQL Server可以做的巧妙的技巧,我会感兴趣)
答案 0 :(得分:1)
将其更改为LEFT JOIN
并显示每个项目,如果没有所有者,则显示NULL
。
select Items.*, Owners.*
from Items
left join Owners on Items.OwnerId = Owners.OwnerId
left join OwnerPermissions on OwnerPermissions.OwnerId = Owners.OwnerId
where OwnerPermissions.UserId = $userId