使用SQL Server返回自定义结果
这有点复杂,所以我要把它分解一下。我正在尝试获取结果,但无法确定查询将是什么样子。前提是,一个用户已经购买了一套特定的物品,他们的装备。当他们访问我的网站时,他们会看到用户提交的工具包或设置。我只想向他们展示他们购买的装备。他们不需要看到他们没有的装备设置。我希望这是有道理的。我的桌子是这样的:使用SQL Server返回自定义结果,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,这有点复杂,所以我要把它分解一下。我正在尝试获取结果,但无法确定查询将是什么样子。前提是,一个用户已经购买了一套特定的物品,他们的装备。当他们访问我的网站时,他们会看到用户提交的工具包或设置。我只想向他们展示他们购买的装备。他们不需要看到他们没有的装备设置。我希望这是有道理的。我的桌子是这样的: [Gear] gearID是唯一的键 有所有装备(话筒、头部、效果)的列表,每个装备都有唯一的id [Kits] kitID是唯一的键 具有用户提交的所有工具包的列表 [KitGearLink]
[Gear]
是唯一的键gearID
- 有所有装备(话筒、头部、效果)的列表,每个装备都有唯一的id
[Kits]
是唯一的键kitID
- 具有用户提交的所有工具包的列表
[KitGearLink]
此表将[Kits]
和[Gear]
相互连接。这张表列出了用户提交的装备
[用户]
是唯一的键userID
- 所有用户的列表
[UserGear]
将[users]和[gear]表链接在一起。这是存储用户的个人装备的内容
那么,我如何为每个用户调出记录,向他们展示所有与他们拥有的装备配合使用的套件。如果一个工具包有用户不拥有的东西,那么它就不会显示它们。有什么想法吗
谢谢大家 可能是这样的:
SELECT *
FROM Kit k
WHERE k.KitID NOT IN (
SELECT DISTINCT kg.KitID
FROM KitGearLink kg
LEFT JOIN (
SELECT ug0.GearID
FROM UserGear ug0
WHERE ug0.UserID = @userParam
) ug ON kg.GearID = ug.GearID
WHERE ug.GearID = null
)
对于给定的用户id,子查询返回未能通过gear id的kit,将用户和kit(带有一点用户没有的gear的kit)连接起来。这用于过滤系统中的套件列表
编辑:引入第二个子查询,在左连接发生之前按用户id参数过滤用户装备,请参阅注释。好的,您需要一个装备列表,其中装备中的所有装备在某一点上都与特定用户相关联。最好的选择是通过SP并使用内存表。这假设您正在为特定用户请求工具包。您可以获得所有用户的完整列表,但成本更高且更复杂
DECLARE @UserId as int
SELECT @Userid = YOURUSER
Declare @tblUserKits TABLE (
UserId int null,
KitId int null,
GearId int null
)
-- GET ALL KITS THAT A USER HAS AT LEAST ONE PART OF
Insert Into @tbluserkits
select distinct u.userid, k.kitid, k.gearid
from usergear u
inner join Kitgearlink k on u.gearid = k.gearid
where u.Userid = @UserId
-- DELETE ALL KITS THAT THE USER IS MISSING A PART FOR
Delete from @tblUserKits WHERE KitId in
(select distinct t.kitid
from @tbluserkits t
inner join kitgearlink k on t.kitid = k.kitid
left outer join usergear u on k.gearid = u.gearid
WHERE u.gearid is null)
-- Finally return a list of kits
Select distinct KitId from @tblUserKits
刚刚意识到这将不起作用,因为如果加入失败,用户ID将为空-我将继续考虑这个问题!