【问题标题】:Getting 5level relation with one mysql query用一个 mysql 查询获得 5 级关系
【发布时间】:2010-01-05 15:08:06
【问题描述】:

非常感谢您事先的回答。我需要做这样的事情

我有一个表友谊(id,user_id,friend_id,status,timestamp)

假设我是一个 user_id=43 的用户,我正在访问一个 user_id=15 的用户

在个人资料中它应该是友谊的连接线

让我描述一下...假设我与用户有朋友关系(user_id=3 并且 user_id=3 的用户是我正在访问的用户的朋友。

所以在网站上我会看到

连接

MyIcon->UserIcon(15)->UserIcon(3)->UserIcon(我正在访问)

并且仅在所有的友谊状态为 status=1 的情况下...

谁能告诉我查询应该是什么样子的?

【问题讨论】:

  • 那么您在寻找“共同的朋友”吗?或者我猜,更像是一个家谱。创建树需要递归函数,mysql 不支持递归,postgres 和其他几个支持。
  • 我不确定单个查询是否会是一个好主意。当你用 user_id=3 拜访你的朋友时会发生什么?如果您访问的用户是您的多个朋友的朋友,会发生什么?当友谊链长于您上面描述的两跳时会发生什么?

标签: sql mysql entity-relationship


【解决方案1】:

使用普通的 MySQL,没有本地方法可以做到这一点。您必须决定要查看的深度,并使用该数量的 JOIN 操作来查看您是否可以从一个用户 ID“到达”另一个用户 ID,或者您可以试一试社区贡献的 Graph 引擎:

http://openquery.com/products/graph-engine

(这涉及使用非官方的二进制 AFAIK,也许它已经可以作为插件使用,但我不确定)

使用该引擎,您可以在一个简单的查询中完成:

SELECT * FROM foo WHERE latch = 1 AND origid = 15 AND destid = 43;

然后,这将为您从用户 15 到用户 43 必须经过的每个链接返回一行。您可以使用应用程序代码很好地显示它。

【讨论】:

    【解决方案2】:

    如果您将其建模为嵌套集建模层次结构,而不是您拥有的邻接列表模型,那么此查询将是微不足道的。实际上,您正在考虑必须使用递归,这对于关系数据库来说并不自然。

    有关建模层次结构的一些重要信息,请查看Joe Celko's book

    【讨论】:

      【解决方案3】:

      您可能会查看this 对有关递归选择的问题的回答,以了解您可以在 mySql 方面进行的破解。它展示了如何为选择创建层次结构。

      在 mySql (ANSI SQL) 中,没有“本机”方式来执行这样的查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-29
        • 2014-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多