首页 > 解决方案 > 如何创建一个循环,或者如何将先前 SELECT 语句的结果用于下一个 SELECT 语句?

问题描述

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

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

虽然我目前正在寻求一个非常手动的选项:继续进行另一次搜索,直到达到我想要的水平,有没有办法构建一个循环,根据 WHERE marketGroupID X = parentGroupID Y 和 hasTypes = 0 保持选择?

我正在尝试替换的手动方法

我主要使用的列是marketGroupID 和parentID。到目前为止,我尝试的是使用 c.fetchall() 来获取先前的结果并将其放入变量 next_input 中。然后我使用参数'?在 Python 中使用 sqlite3。这样做的问题是输入的数量可以改变,因为前面的 SELECT 语句会给我一个元组列表,它的长度可能从六十到几百不等。

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?

标签: pythondatabasesqlite

解决方案


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


推荐阅读