python - 如何创建一个循环,或者如何将先前 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?
解决方案
Sqllite 支持递归查询,可用于分层查询(这是您正在尝试做的)。看看这里的文档 它甚至有一个关于分层查询的部分。这样,您可以通过一次调用数据库来完全替换循环并让它完成工作。
推荐阅读
- reactjs - 如何使用 with-iron-session 在 NextJS api 路由中获取会话?
- node.js - 带有 Typescript 部署的 Heroku NodeJs 无法正常工作
- css - 从 Flex 中删除垂直空间
- html - 站点标题响应性
- bots - Telegram bot getUpdates 字段为空,即使我在 Botfather 中禁用了隐私
- java - 如何在JAVA的jasper报告中动态添加表中的行
- c++ - 我试图将一个字符串值从一个变量分配给 C++ 嵌入式汇编程序中的第二个字符串变量,但我得到了错误的操作数类型
- json - 如何从 Sequelize 搜索中读取 JSON 数据?
- node.js - Express.js 将几乎所有内容都路由到一个请求
- python - 使用 Pytube 下载特定长度的播放列表的视频