php - 具有 3 个分离度级别的表

标签 php mysql

我正在寻找一个查询来在 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. 我将两个方向的关系(例如 1-2 和 2-1,因此没有确认列)存储在名为 Degree_one 的表中
  2. 然后我使用 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/

    相关文章:

    php - 使用 php codeigniter 显示来自 mysql 数据库的数据时出错

    mysql从多个表中查询

    php - 将 PHP MySql 与 Flex 捆绑在一起提供给客户端

    php - 状态不发回到表单上?

    windows - 用于 Windows 的 php-fpm?

    c# - 如果指定的子值为 NULL,则显示父值

    python - 如何在 python MySQL 中使用 `SELECT` 查询来查找行是否存在?

    mysql - Django 搜索查询与 Annotate 比较投票和帖子年龄

    php - 在 mysql 中加入并计算行值?

    php - 更新行直到总和匹配?