【问题标题】:Backtrack in mysql with parent child relationship?在mysql中与父子关系回溯?
【发布时间】:2017-06-23 13:07:45
【问题描述】:

我一直使用父子关系如下

id | parent_id | 
----------------
30 |   0       |
32 |   30      |
33 |   32      |
34 |   32      |
----------------

我想获取 34 的历史记录,以便它的 id 为 34、32、33(因为 32 是父级)和 30(直到父级 id = 0)

我使用了自我加入,但没有解决我的问题。我在 php 中用 mysql 做这个。

查询

SELECT f1.id 
  FROM followup as f1 
  JOIN followup as f2 
    ON f1.id = f2.parent_id 
 WHERE f2.id <= 34 

谁能帮帮我?

【问题讨论】:

  • 不确定 SQL 中是否存在递归。我认为如果您收集所有 ID 关系并在 PHP 中处理它们会更容易。
  • 查看类似问题的一千个答案。
  • 我没有找到任何@Strawberry
  • 你可以查看这个answer我认为它可以帮助你
  • 请告诉我们你现在得到了什么以及你想要什么。

标签: php mysql select php-7


【解决方案1】:

SQL 中的递归是使用通用表表达式 (CTE) 完成的,它基本上是动态视图。

WITH RECURSIVE rec (id, parent_id, level) AS (
  SELECT id, parent_id, 0 FROM followup WHERE parent_id=0

  UNION ALL

  SELECT id, parent_id, level+1 FROM followup
  JOIN rec ON followup.parent_id = rec.id
)
SELECT * FROM rec;

但是,这尚未在 MYSQL 中实现。这是即将推出的 MySQL 8.0 的草稿文档。 https://dev.mysql.com/doc/refman/8.0/en/with.html

MySQL 目前不支持此功能

MySQL 不支持递归,除非你真的想尝试使用存储函数,这太丑陋了。

您最好将此结构转换为非规范化形式一次,并保持该结构。

所以你需要保持这样的结构:

id     ancestor_id    distance
30     0              1
32     0              2
33     0              3
34     0              3
32     30             1
33     30             2
34     30             2
33     32             1
34     32             1

这将允许您进行线性查询,但插入逻辑会很繁重,因为它必须为每个祖先节点插入一条记录。但是由于通常插入信息的频率低于选择的频率,这将是一个更快的实现,它会解决您的问题

【讨论】:

    猜你喜欢
    • 2018-10-03
    • 1970-01-01
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多