[英]How can I write a MySQL query for this database design?
首先,我有一个特定的用户,我想查看与该用户连接的用户。 假设下表中的alex。 我想检查alex是否已连接到另一个用户? 在下表中,它与John和christina相关,因此我选择john和christina。
现在我有另一个用户。 假设马丁,我想看看之前选择的哪些用户(约翰和克里斯蒂娜)与马丁有关。
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
我不确定您的确切要求,但是您选择的数据库设计似乎并不是最好的。
我认为您本来希望与唯一身份用户一起使用的表。 然后是另一个链接这些用户ID的表
--Users Table
ID Name
1 Alex
2 John
3 Jane
...
--UserConnection Table
ID ID_ConnectedTo
1 2
1 3
在这种情况下,Alex连接到John,Alex连接到Jane。
这是您对当前架构的要求:
SELECT user2 FROM
(SELECT user1, user2 FROM connections
UNION
SELECT user2, user1 FROM connections) t
WHERE user1 = 'martin'
您应该考虑“约翰与alex联系”与“ alex与约翰联系”的想法。 如果这是诸如facebook之类的事情,一个人必须允许连接,那么您将需要双向建立连接。 如果连接仅在一个方向上,则表示该连接尚未被另一方批准。
请查看其他用户建议的更规范的数据库设计。
首先,按照SAGExSDX的建议进行结构确实更好。
找到任何关系:
SELECT * from connections where user1 = X OR user2 = X
将X替换为所需的用户名-如果您按照SAGExSDX的建议进行重构,则最好使用userID
我同意代码不是最好的代码,但是如果您想要一个可以捕获双链接的查询,则必须注意Marcus提到的方向。 它使用您描述的表结构接受四个不同的查询(与联合相关联):
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'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.