首先我有一个特定的用户,我想看看它连接到哪个用户。让我们说下表中的亚历克斯。我想检查alex是否与其他用户相关联?在下表中,它与约翰和克里斯蒂娜联系在一起,所以我选择了约翰和克里斯蒂娜。
现在我有另一个用户。让我们说马丁,我想看看之前选定的用户(约翰和克里斯蒂娜)与马丁有什么联系。
ID user1 user2 status
1 alex john 1
2 john martin 1
3 Jane smith 1
4 smith john 1
5 christina alex 1
例如,在上表中:
与亚历克斯有关的人是约翰和克里斯蒂娜。我们想检查哪个用户(john和christina)与martin连接,结果应该是row2。
你们都提到数据库设计不好,请你告诉我它有什么问题?这是我的用户表:
表1,用户
ID username
,这是表2,user_connections
ConnectionID user1_ID user_Connectedto
答案 0 :(得分:4)
我不确定您的具体要求,但您选择的数据库设计似乎并不是最好的。
我想你会想要一张有独特用户的桌子。然后是另一个链接这些用户ID的表
--Users Table
ID Name
1 Alex
2 John
3 Jane
...
--UserConnection Table
ID ID_ConnectedTo
1 2
1 3
在这种情况下,Alex与John连接,Alex与Jane连接。
答案 1 :(得分:0)
以下是您要求的当前架构:
SELECT user2 FROM
(SELECT user1, user2 FROM connections
UNION
SELECT user2, user1 FROM connections) t
WHERE user1 = 'martin'
你应该考虑“约翰与亚历克斯联系”的想法与“亚历克斯与约翰联系”不同。如果这是像facebook那样,一个人必须允许连接,那么你将想要双向建立连接。如果连接仅在一个方向上,则表示该连接尚未得到另一方的批准。
请查看其他用户建议的更多规范化数据库设计。
答案 2 :(得分:0)
首先,按照SAGExSDX的建议,结构确实会更好......
找到任何关系:
SELECT * from connections where user1 = X OR user2 = X
将X替换为您需要的用户名 - 如果您进行重构,则更好用户ID AS SAGExSDX建议
答案 3 :(得分:0)
我同意代码不是最好的,但是如果你想要一个可以获取双链接的查询,你必须要小心Marcus提到的方向。它使用您描述的表结构需要四个不同的查询(使用union连接):
SELECT user2 FROM connections
WHERE user1 IN (
SELECT user2 FROM connections
WHERE user1 = 'alex'
)
UNION
SELECT user1 FROM connections
WHERE user2 IN (
SELECT user1 FROM connections
WHERE user2 = 'alex'
)
UNION
SELECT user1 FROM connections
WHERE user2 IN (
SELECT user2 FROM connections
WHERE user1 = 'alex'
)
AND user1 <> 'alex'
UNION
SELECT user2 FROM connections
WHERE user1 IN (
SELECT user1 FROM connections
WHERE user2 = 'alex'
)
AND user2 <> 'alex'