我正在寻找一个查询来在 MySQL 中创建一个表,其中包含两个用户之间的分离程度。我已经找到Degrees of Separation Query但如果我理解正确的话,这将产生一个与共同 friend 推荐的 friend 列表。我正在寻找的内容略有不同。
我有一个用户之间有“ friend ”的表(不包含 1 到 2 和 2 到 1 等重复关系)。
friends
(id
,initiator_user_id
,friend_user_id
,is_confirmed
)
我想要创建的是一张包含 friend 、 friend 的 friend 和 FoFoF 之间所有关系的表。像这样:
relation_degrees
(id
,first_user_id
,second_user_id
,relation_degree
)
因此,relation_ Degree 列仅包含值 1( friend )、2(FoF)和 3(FoFoF)。
我可以在 Excel 中完成此操作,但我的 friend 存储在矩阵中,这使得计算在我看来更容易一些。我希望有人能够给我一个提示,让我在 MySQL 中做同样的事情。
谢谢!!
<小时/>编辑:在 Fluffeh 的帮助下,我找到了以下问题的解决方案。
- 我将两个方向的关系(例如 1-2 和 2-1,因此没有确认列)存储在名为 Degree_one 的表中
- 然后我使用 fluffeh 的一级和二级查询来制作具有一级和二级关系的表格。我添加了一个 WHERE user <> Friend 语句来过滤关系(我猜这就是为什么 fluffeh 的三级关系查询无法正常工作的原因之一)
`Create table degree_two select mb.user as User, mb.friend as Friend, min(mb.rel) as relation_degree
from ( select 1 as rel, fr1.User, fr1.Friend from 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 ) mb Where `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_degree
from
(
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
基本上,您似乎拥有能够从friend1链接到friend2的ID,但该结构还允许进行查询,允许friend1使用friend2来查看他们的 friend 是谁 - 您可以轻松地将这些结果与学位结合起来够了。
编辑:根据评论解决问题:
select
mb.initiator_user_id as first_user_id,
mb.friend_user_id as second_user_id,
min(mb.rel) as relation_degree
from
(
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)
) mb
group 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_degree
from
(
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)
) mb
group by
mb.initiator_user_id,
mb.friend_user_id
关于php - 具有 3 个分离度级别的表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23801612/