如何消除SQL查询的结果,只获取某些不重复的信息?
交易如下: 我有这些表格,它们都是用来制作类似Steam的应用程序(下载游戏、与朋友聊天等)。当我想知道我的哪些朋友玩我的每一款游戏(比如说我玩Minecraft,我想看看我的哪些朋友也玩Minecraft)时,我的问题就来了,我正在努力形成一个查询来告诉我这一点。我原以为这可能是在钥匙工作的帮助下完成的,但我试着并没有用 也许这有助于理解我最终想要得到什么:如何消除SQL查询的结果,只获取某些不重复的信息?,sql,sql-server,Sql,Sql Server,交易如下: 我有这些表格,它们都是用来制作类似Steam的应用程序(下载游戏、与朋友聊天等)。当我想知道我的哪些朋友玩我的每一款游戏(比如说我玩Minecraft,我想看看我的哪些朋友也玩Minecraft)时,我的问题就来了,我正在努力形成一个查询来告诉我这一点。我原以为这可能是在钥匙工作的帮助下完成的,但我试着并没有用 也许这有助于理解我最终想要得到什么: 如您所见,我有与Migue相同的Crashex图例,也有与Test相同的Crashex图例和Overwatch。我希望每个普通游戏中
如您所见,我有与Migue相同的Crashex图例,也有与Test相同的Crashex图例和Overwatch。我希望每个普通游戏中每个朋友只看到一个结果,这样我只能看到结果1、8和9。您需要加入
用户游戏两次,而不是使用OR键加入一次
将User1
和别名UserGames
作为UG1加入一次;
然后再次加入User2
和别名UserGames
作为UG2
然后,在WHERE子句中,找到其中的行UG1.Game=UG2.Game
好的,尝试使用CTE来帮助概念化它,并将其分解为小块。我会先为主键创建标识列。如果不使用ID引用,那么使用关系数据库没有任何好处。但也许是这样的。
你不知道;我不必使用CTEs,但我认为它有助于一步一步地进行。你真正想要的诀窍是我的朋友玩我的游戏。在这里,您执行左连接,然后获取任何不为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
类似下面的代码应该可以为您获取所需的数据。
作为最佳实践,不要使用“选择*”;而是显式声明需要返回的列。也就是说,我不认为你会进入最佳实践,因为看着你的DB设计就等于听到黑板上的钉子;代理键、第三范式、外键约束等
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'
选择
US.昵称,UG.game,MG.[用户],MG.game
来自用户朋友作为UF
在(UF.user1=US.nickname或UF.user2=US.nickname)和US.nickname'Penny'上以我们的身份加入用户
在美国以UG的身份加入用户游戏。昵称=UG。[用户]
在UG.game=MG.game上以MG的身份加入UserGames
“Penny”在哪里(UF.user1,UF.user2)
和MG。[用户]=“Penny”
请不要在文本中发布图像,并包含数据样本和所需结果(在数据中)。不确定如何将图像发布为图像,但我将尝试在文本中不发布表格结构,而不是屏幕截图。你试过/做过什么?不太理解你的问题不要发布图片。你需要发布文本,这样任何人都可以在不浪费额外时间的情况下进行复制和编辑。非常感谢,伙计。甚至不知道CTE是什么。为了理解到底发生了什么,以及“诸如此类”的部分遗漏了什么,哈哈,我不得不付出一点汗水,但我认为这最终帮助了我。再次感谢你,真的。不客气。CTEs示例通常用于显示递归查询,因此如果您开始这样做,请准备好受到其他SQL人员的嘲笑。您可以使用派生查询或子请求来完成相同的工作,但这种方式最接近于使用SQL进行干净编码。