这是交易:
我有这些表,这些表都是用于制作类似Steam的应用程序(下载游戏,与朋友聊天等)。当我想知道哪个朋友玩我的每一个游戏时(我说我玩《我的世界》,我也想看看我的哪些朋友也玩我的世界),而我正在努力形成一个查询我那个。我以为可以在EXCEPT键盘的帮助下完成此操作,但我尝试无济于事。
也许这将有助于了解我最终想要得到的东西:
如您所见,我与 Migue 有共同的 Crashex Legends ,还有 Crashex Legends 和 Overwatch 和 Test 。在每个普通游戏中,我只希望每个朋友看到一个结果,所以我只会看到结果1、8和9。
答案 0 :(得分:1)
好吧,尝试使用CTE帮助概念化并将其分解成小块。我将首先为您的主键创建标识列。如果您不使用ID进行引用,则使用关系数据库没有任何好处。但是也许是这样的。 您不必使用CTE,但我认为这有助于逐步进行。您真正要寻找的技巧是MyFriendsThatPlayMyGames_CTE。在这里,您进行左联接,然后获取不为null的所有内容,这意味着存在匹配项。更改为null可获得您的朋友所拥有的您不喜欢的游戏等。
with
MyFriends_CTE (me, friend)as(
Select user1, user2
from userFriends
where user1 = @ME
UNION
Select user2, user1
from userFriends
where user2 = @Me
),
MyGames_CTE as (
blah blah
),
MyFriendsGames_CTE as (
select
from myfriends_cte
join games
),
MyFriendsThatPlayMyGames_CTE as(
select
from MyfriendsGames_CTE
left join myGames_CTE
on blah blah
where myGames_CTE.name is not null
)
select
from MyFriendsThatPlayMyGames_CTE
答案 1 :(得分:0)
您需要两次加入UserGames
,而不是使用OR进行一次。
使用User1
和别名UserGames
作为UG1加入一次;
然后使用User2
和别名UserGames
作为UG2再次加入。
然后在您的WHERE子句中,找到UG1.Game = UG2.Game
答案 2 :(得分:0)
类似以下代码的代码应该可以为您提供所需的数据。 最佳做法是,不要使用“选择*”;而是明确声明需要返回的列。话虽这么说,但我并不认为您是最佳实践,因为查看数据库设计就等于在黑板上钉钉子。代理键,第三范式,外键约束等。
SELECT
US.nickname, UG.game, MG.[user], MG.game
FROM UserFriends AS UF
JOIN Users AS US ON (UF.user1 = US.nickname OR UF.user2 = US.nickname) AND US.nickname <> 'Penny'
JOIN UserGames AS UG ON US.nickname = UG.[user]
JOIN UserGames AS MG ON UG.game = MG.game
WHERE 'Penny' IN (UF.user1, UF.user2)
AND MG.[user] = 'Penny'