这有点复杂,所以我要打破它。我试图得到结果,但无法弄清楚查询会是什么样子。前提是,用户购买了一套特定的物品,他们的装备。当他们访问我的网站时,他们会看到用户提交的工具包或设置。我只想向他们展示只有他们购买过的装备的设置。他们不需要看到他们没有的装备设置。我希望这是有道理的。这是我的表格的样子:
[Gear]
gearID
是唯一键 [Kits]
kitID
是唯一键 [KitGearLink]
此表格将[Kits]
和[Gear]
相互关联。因此,这是列出用户提交的工具包装备的表格。
[Users]
userID
是唯一键 [UserGear]
将[users]和[gear]表链接在一起。这就是存储用户个人装备的内容。
那么我如何为每个用户提取记录,向他们显示所有可以使用它们的装备的套件。如果套件具有用户不拥有的东西,则它不会显示它们。有任何想法吗?
谢谢你们!
答案 0 :(得分:1)
也许是这样的:
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,子查询返回套件,这些套件在用户和套件之间连接齿轮ID失败(套件具有用户没有的齿轮)。这用于过滤系统中的套件列表。
修改:引入第二个子查询,以便在左连接发生前按用户ID参数过滤用户设备,请参阅注释。
答案 1 :(得分:0)
好的,您需要一个工具包列表,其中套件中的所有齿轮在某些时候都与特定用户相关联。最好的办法是通过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