我无法绕过递归查询,并希望有人能指出我正确的方向。
以下是一些代表网站类别结构的示例数据:
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
答案 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"""