繁体   English   中英

如何为该数据库设计编写MySQL查询?

[英]How can I write a MySQL query for this database design?

任务1

首先,我有一个特定的用户,我想查看与该用户连接的用户。 假设下表中的alex。 我想检查alex是否已连接到另一个用户? 在下表中,它与John和christina相关,因此我选择john和christina。

任务2

现在我有另一个用户。 假设马丁,我想看看之前选择的哪些用户(约翰和克里斯蒂娜)与马丁有关。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM