我正在寻找一个查询,以在MySQL中创建一个表,其中两个用户之间的分隔程度。我已经找到Degrees of Separation Query。但是,如果我正确理解的话,这将导致与共同的朋友推荐的朋友清单。我在找什么有点不同。我有一个用户之间有“朋友”的表(不包含重复的关系,如1到2和2到1)。 friends(id,initiator_user_id,friend_user_id,is_confirmed)我正在尝试创建一张表格,其中包含朋友,朋友的朋友和FoFoF之间的所有关系。像这样: relation_degrees(id,first_user_id,second_user_id,relation_degree)因此Relation_degree栏仅包含值1(朋友),2(FoF)和3(FoFoF)。我可以在Excel中完成此操作,但是我的朋友们将它们存储在一个矩阵中,这使IMO的计算更加容易。我希望有人能够给我一个提示,以在MySQL中执行相同的操作。谢谢!!编辑:在Fluffeh的帮助下,我找到了解决我的问题的以下方法。我将双向的关系(如1-2和2-1,因此没有确认列)存储在称为degree_one的表中然后,我使用来自fluffeh的一级和二级查询来制作具有第一级和第二级关系的表。我添加了WHERE用户 Friend语句以过滤关系(我想这是fluffeh的三级关系查询无法正常工作的原因之一) `Create table degree_two select mb.user as User, mb.friend as Friend, min(mb.rel) as relation_degree 从 ( 选择 1作为相对 fr1.User, fr1。朋友 从 degree_one fr1 union all select 2 as rel, fr2.User, fr3.Friend from degree_one fr2 left outer join degree_one fr3 on fr2.Friend=fr3.User ) mb Where user <> friend group by mb.User, mb.Friend然后,我使用此表执行几乎相同的查询。 select语句在degree_two表上,但外部联接仍来自degree_one表。 Create table degree_three select mb.user as User, mb.friend as Friend, min(mb.relation_degree) as relation_degree from ( select fr1.relation_degree, fr1.User, fr1.Friend from degree_two fr1 union all select 3 as rel, fr2.User, fr3.Friend from degree_two fr2 left outer join degree_one fr3 on fr2.Friend=fr3.User ) mbWhere `user` <> `friend`group by mb.User, mb.Friend这是一种变通方法,但是它给了我所需的输出。我仍然想知道为什么来自fluffeh的查询无法正常工作,因为我真的希望使用单个查询作为解决方案。我将继续摆弄查询...我希望有人可以帮助我将这些查询合并为一个。 最佳答案 您可以使用外部联接返回表本身来执行此操作...select mb.initiator_user_id as first_user_id, mb.friend_user_id as second_user_id, mb.rel as relation_degreefrom ( select 1 as rel, fr1.initiator_user_id, fr1.friend_user_id from friends fr1 union all select 2 as rel, fr2.initiator_user_id, fr3.friend_user_id from friends fr2 left outer join friends fr3 on fr2.friend_user_id=fr3.initiator_user_id // and again etc or in a code loop (not really done these much) ) mb基本上,您似乎可以将ID从朋友1链接到朋友2,但是该结构还允许查询,使朋友1可以使用朋友2查看谁是他们的朋友-您可以轻松地将这些结果与度数结合起来。编辑:根据评论解决问题:select mb.initiator_user_id as first_user_id, mb.friend_user_id as second_user_id, min(mb.rel) as relation_degreefrom ( select 1 as rel, fr1.initiator_user_id, fr1.friend_user_id from friends fr1 where is_confirmed = 1 union all select 2 as rel, fr2.initiator_user_id, fr3.friend_user_id from friends fr2 left outer join friends fr3 on fr2.friend_user_id=fr3.initiator_user_id and fr3.is_confirmed = 1 // and again etc or in a code loop (not really done these much) ) mbgroup by mb.initiator_user_id, mb.friend_user_id编辑:根据评论添加第三层关系:select mb.initiator_user_id as first_user_id, mb.friend_user_id as second_user_id, min(mb.rel) as relation_degreefrom ( select 1 as rel, fr1.initiator_user_id, fr1.friend_user_id from friends fr1 where is_confirmed = 1 union all select 2 as rel, fr2.initiator_user_id, fr3.friend_user_id from friends fr2 left outer join friends fr3 on fr2.friend_user_id=fr3.initiator_user_id and fr3.is_confirmed = 1 union all select 3 as rel, fr4.initiator_user_id, fr5.friend_user_id from friends fr3 left outer join friends fr4 on fr3.friend_user_id=fr4.initiator_user_id and fr4.is_confirmed = 1 left outer join friends fr5 on fr4.friend_user_id=fr5.initiator_user_id and fr5.is_confirmed = 1 // and again etc or in a code loop (not really done these much) ) mbgroup by mb.initiator_user_id, mb.friend_user_id关于php - 具有3种分离度的表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23801612/