如何创建循环,或将上一个SELECT语句的结果用于下一个SELECT语句的方法?

时间:2019-05-29 01:11:57

标签: python database sqlite

我有一个带有嵌套层次结构的数据库。在层次结构的高层,没有任何与给定的 marketGroupID 相关的实际 typeID (单个项目)。

相反,我从顶部开始使用字符串搜索来找到所需的类别。我需要使用 marketGroupIDs 作为下一次搜索的 parentGroupIDs ,继续在层次结构中向下移动,以便在该子类别中找到所有ID。这会一直划分为更多的子类别,直到 hasTypes 列= 1(有与此子类别关联的typeID)为止。

虽然我目前正在寻求一个非常手动的选项:继续进行另一次搜索,直到达到我想要的水平为止,有没有一种方法可以构造一个循环,使其根据WHERE marketGroupID X = parentGroupID Y和hasTypes = 0吗?

我要替换的手动方法

我主要处理的列是marketGroupID和parentID。到目前为止,我尝试使用c.fetchall()获取先前的结果并将其放入变量next_input中。然后我使用参数“?”在Python中使用sqlite3。问题在于输入的数量可以更改,因为前面的SELECT语句将为我提供一个元组列表,其长度可以在60到数百之间。

c.execute("""SELECT marketGroupID FROM invMarketGroups WHERE parentGroupID IN (SELECT marketGroupID FROM invMarketGroups WHERE marketGroupName='Ships' 
OR marketGroupName = 'Ship Equipment' OR marketGroupName = 'Implants & Boosters')""");

下一步搜索。

python next_input = c.fetchall()

因此,花一些时间使这些数字等于列表长度,我设法通过将结果变成单个列表来使其起作用:

next_input = [i[0] for i in next_input]

c.execute("SELECT marketGroupID FROM invMarketGroups WHERE parentGroupID IN ({idlist_formatted})".format(idlist_formatted= ','.join(['?']*len(next_input))), next_input)

我如何进行循环,以使其继续递归运行,直到hasTypes!= 0为止,并抢占hasTypes = 1的marketGroupIDs?

1 个答案:

答案 0 :(得分:0)

Sqllite支持可用于分层查询的递归查询(这是您要尝试的操作)。看一下文档here 它甚至有一个关于层次查询的部分。这样,您可以一次调用数据库来完全替换循环,并让它完成工作。