【问题标题】:Python sqlite3 recursive query for category tree structurePython sqlite3递归查询类别树结构
【发布时间】:2018-04-13 16:52:13
【问题描述】:

我无法理解递归查询并希望有人能指出我正确的方向。

以下是一些代表网站类别结构的示例数据:

代码 标签级别 父代码 汽车摩托汽车 - 摩托 1 autokinito Car 2 自动摩托车 car-aksesouar 汽车配件 3 autokinito diakosmitika-aytokinitou 汽车装饰品 4 car-aksesouar katharistika-aytokinitou 汽车清洁剂 4 car-aksesouar keraies autokinhtou 汽车天线 4 car-aksesouar car-analosima Car Reusables 3 autokinito ladia-aytokinitou 汽车油 4 car-analosima lampes-aytokinitou 车灯 4 car-analosima

我需要递归查找并为列表中的每个 Code 值查找附加到级别 1 和级别 2“祖先”的“标签”值,例如,查找代码的 parent_code,然后遍历到上面的父级, 直到您到达 1 级。例如,如果您手动查看代码“diakosmitika-aytokinitou”,“Auto - Moto”是我需要的 1 级“标签”值,“汽车”是级别2 我需要的“标签”值。

到目前为止,我想出了这个:

query3="WITH RECURSIVE parent(x) AS ("\
            "SELECT 'diakosmitika-aytokinitou' "\
             "   UNION ALL "\
            "SELECT categories.parent_code "\
            "FROM categories, parent "\
            "WHERE categories.code=parent.x AND categories.parent_code IS NOT NULL "\
        ")"\
        "SELECT * FROM parent;"

这给了我这个输出作为结果集:

(u'diakosmitika-aytokinitou',)
(u'car-aksesouar',)
(u'autokinito',)
(u'auto-moto',)
(u'',)

所以,我得到了所有的祖先。我似乎无法弄清楚如何将其带到下一步并获得我想要的东西,而不是获取我的结果,然后循环使用另一个查询以找到 parent_code 为 1 和 2 的那些...希望找到一个更优雅的方式,因为我的真实数据要大得多!谢谢!

PS:使用 Python 2.7 和 sqlite3

【问题讨论】:

  • 您已经正在使用另一个查询来遍历结果(在底部)。只需将级别添加到 CTE。
  • 谢谢,CL。我对此进行了一段时间的研究并提出了以下代码,它只是一遍又一遍地复制了我的原始数据query3="WITH RECURSIVE cte AS ("\ "SELECT code , parent_code, label, level FROM categories"\ " UNION ALL "\ "SELECT categories.code, categories.parent_code, categories.label, categories.level "\ "FROM categories, cte "\ "WHERE categories.code=cte.code AND categories.parent_code IS NOT NULL "\ ")"\ "SELECT * FROM cte WHERE code='diakosmitika-aytokinitou' LIMIT 100;"

标签: python sqlite


【解决方案1】:

只需将您需要的信息添加到 CTE:

query = """WITH RECURSIVE parents AS (
             SELECT label, level, parent_code
             FROM categories
             WHERE code = 'diakosmitika-aytokinitou'

             UNION ALL

             SELECT c.label, c.level, c.parent_code
             FROM categories c
             JOIN parents p ON c.code = p.parent_code
           )
           SELECT label
           FROM parents
           WHERE level BETWEEN 1 AND 2
           ORDER BY level"""

【讨论】:

  • 谢谢,CL。这让我很接近]。我也想要“叶子代码”和级别,所以:query4 = """WITH RECURSIVE parents AS ( SELECT label, level, parent_code FROM categories WHERE code = 'diakosmitika-aytokinitou' UNION ALL SELECT c.label, c.level, c.parent_code FROM categories c JOIN parents p ON c.code = p.parent_code ) SELECT CAST ('diakosmitika-aytokinitou' as TEXT),label,level FROM parents WHERE level BETWEEN 1 AND 2 ORDER BY level"""
  • 所以,现在当我尝试遍历所有类别以获取每个代码的这些结果时,循环似乎停止在第一个,即使我知道存储了许多类别代码。 querycat="SELECT * FROM categories" catresult=crsr.execute(querycat) for c in catresult: ..do the recursive query... for i in result: print(i) #really, I will want to insert it somewhere else.
  • 问题很可能出在您没有显示的代码中。那是different question。
  • 我通过将“我没有显示的代码”放入一个函数并从循环中调用该函数来使其工作。它很乱,但得到了我需要做的事情。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 2012-10-22
  • 1970-01-01
  • 2022-09-27
  • 2012-03-18
  • 2018-08-08
  • 2015-04-25
相关资源
最近更新 更多