0

这有点复杂,所以我将对其进行分解。我正在尝试获取结果,但无法弄清楚查询会是什么样子。前提是,用户购买了一组特定的物品,即他们的装备。当他们访问我的站点时,他们会看到用户提交的套件或设置。我只想向他们展示只有他们购买的装备的设置。他们不需要查看带有他们没有的装备的设置。我希望这是有道理的。这是我的表的样子:

[Gear]

  • gearID是唯一键
  • 有一个所有装备(麦克风、头、效果器)的列表,每个装备都有唯一的 ID

[Kits]

  • kitID是唯一键
  • 包含所有用户提交的套件的列表

[KitGearLink]

该表将[Kits][Gear]相互连接。所以这张表列出了用户提交的套件有哪些装备。

[Users]

  • userID是唯一键
  • 所有用户的列表

[UserGear]

将 [users] 和 [gear] 表链接在一起。这是存储用户个人装备的内容。

那么,我如何为每个用户提取记录,向他们展示所有可以与他们拥有的装备一起使用的套件。如果套件包含用户不拥有的东西,则不会显示它们。有任何想法吗?

多谢你们!

4

2 回答 2

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 参数过滤用户齿轮,请参阅评论。

于 2013-05-02T15:43:42.430 回答
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
于 2013-05-02T18:44:05.243 回答