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

时间:2010-06-25 13:48:18

标签: php mysql

任务1

首先我有一个特定的用户,我想看看它连接到哪个用户。让我们说下表中的亚历克斯。我想检查alex是否与其他用户相关联?在下表中,它与约翰和克里斯蒂娜联系在一起,所以我选择了约翰和克里斯蒂娜。

任务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

4 个答案:

答案 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'