Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何消除SQL查询的结果,只获取某些不重复的信息?_Sql_Sql Server - Fatal编程技术网

如何消除SQL查询的结果,只获取某些不重复的信息?

如何消除SQL查询的结果,只获取某些不重复的信息?,sql,sql-server,Sql,Sql Server,交易如下: 我有这些表格,它们都是用来制作类似Steam的应用程序(下载游戏、与朋友聊天等)。当我想知道我的哪些朋友玩我的每一款游戏(比如说我玩Minecraft,我想看看我的哪些朋友也玩Minecraft)时,我的问题就来了,我正在努力形成一个查询来告诉我这一点。我原以为这可能是在钥匙工作的帮助下完成的,但我试着并没有用 也许这有助于理解我最终想要得到什么: 如您所见,我有与Migue相同的Crashex图例,也有与Test相同的Crashex图例和Overwatch。我希望每个普通游戏中

交易如下:

我有这些表格,它们都是用来制作类似Steam的应用程序(下载游戏、与朋友聊天等)。当我想知道我的哪些朋友玩我的每一款游戏(比如说我玩Minecraft,我想看看我的哪些朋友也玩Minecraft)时,我的问题就来了,我正在努力形成一个查询来告诉我这一点。我原以为这可能是在钥匙工作的帮助下完成的,但我试着并没有用

也许这有助于理解我最终想要得到什么:


如您所见,我有与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进行干净编码。