Python sqlite3类别树结构的递归查询

时间:2018-04-13 16:52:14

标签: python sqlite

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

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

Code                      Label            Level  Parent Code

auto-moto                 Auto - Moto      1
autokinito                Car              2      auto-moto
car-aksesouar             Car accessories  3      autokinito
diakosmitika-aytokinitou  Car Decorations  4      car-aksesouar
katharistika-aytokinitou  Car Cleaners     4      car-aksesouar
keraies autokinhtou       Car Antennas     4      car-aksesouar
car-analosima             Car Reusables    3      autokinito
ladia-aytokinitou         Car Oils         4      car-analosima
lampes-aytokinitou        Car Lamps        4      car-analosima

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

1 个答案:

答案 0 :(得分:0)

只需将您需要的信息添加到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"""