【发布时间】:2018-07-24 05:50:25
【问题描述】:
我在一个跟踪社交网络的 SQL Server 数据库中有两个表。首先是friends表,看起来像
userId | friendId | acceptDate
==============================
1 | 8 | 2018-01-20
8 | 12 | 2017-11-20
12 | 1 | 2017-12-18
所以每一对都是唯一的组合,顺序只是由哪个用户发起连接来决定的。
第二张表是有用户信息的表
userId | name | email | ...
1 | John | john@example.com | ...
2 | Bill | bill@example.com | ...
3 | Cathy | cathy@example.com | ...
我想创建一个视图,在该视图中,我可以通过最少的服务器端处理轻松获取特定用户的朋友所需的数据。所以本质上我想创建一个数据看起来像的视图:
userId | friendID | friendName | friendEmail | acceptDate | ....
1 | 8 | 8's Name | 8's Email | 2018-01-20 |...
1 | 12 | 12's Name | 12's Email | 2017-12-18 |...
8 | 12 | 12's Name | 12's Email | 2017-11-20 |...
8 | 1 | 1's Name | 1's Email | 2018-01-20 |...
12 | 1 | 1's Name | 1's Email | 2017-12-18 |...
12 | 8 | 8's Name | 8's Email | 2017-11-20 |...
基本上,它将从朋友表中存在的每个友谊对创建两行(一个按现有顺序,一个翻转),并将加入用户表中的朋友信息。这样,我可以简单地查询视图以找到我所有特定用户的朋友,它只会返回该用户的朋友的行及其信息,我无需进行任何处理来整理。
任何帮助将不胜感激。
谢谢!
【问题讨论】:
-
您的桌子设计不是最理想的,但它可以工作。你试过什么?在我看来,您需要在 userID 或friendID 上使用左连接到您的另一个表。
-
好吧,也许不是左连接,因为这会返回没有朋友的用户,这不是问题中想要的结果。
-
@TabAlleman 确实如此。这个查询之所以这么难,是因为数据结构设计得不好。当您正确设计数据时,很容易检索信息。但是,当您的设计不好时,使用起来会很痛苦。
-
非常感谢大家帮助我!该数据库应该如何设计以使事情变得更容易?我很想听听你们的任何建议,看看我能不能做些什么。 @SeanLange
-
我更多地来自编程背景,因此结构化 SQL 查询与在 python 或 php 中处理数据需要一些不同的思维方式。我尝试了几种类型的连接,但下面使用带有“on”/“or”部分的内部连接的答案似乎已经成功了。我试图在我的帖子中尽可能清楚,但不确定为什么我在那里得到了反对票,但是任何关于这方面的提示都会对以后的帖子有用。再次感谢!
标签: sql sql-server tsql join