У меня есть база данных с вложенной иерархической структурой. На верхних уровнях иерархии нет фактических идентификаторы типов (отдельных элементов), связанных с данным marketGroupID.
Вместо этого я начинаю сверху, используя строковый поиск, чтобы найти нужные категории. Мне нужно продолжать спускаться по иерархии, используя идентификаторы групп рынка, который я выбрал в качестве идентификаторы родительской группы для следующего поиска, чтобы найти все идентификаторы в этой подкатегории. Это продолжает делиться на большее количество подкатегорий, пока столбец hasTypes = 1 (с этой подкатегорией связаны идентификаторы типов).
Хотя в настоящее время я использую очень ручной вариант: продолжайте выполнять еще один поиск, пока не доберусь до нужного уровня, есть ли способ построить цикл, который будет продолжать ВЫБОР на основе WHERE marketGroupID X = parentGroupID Y и hasTypes = 0?
РУЧНОЙ МЕТОД Я ПЫТАЮСЬ ЗАМЕНИТЬ
Столбцы, с которыми я в основном работаю, — это marketGroupID и parentID. До сих пор я пробовал использовать c.fetchall(), чтобы получить предыдущий результат и поместить его в переменную next_input. Затем я использую параметр '?' используя sqlite3 в Python. Проблема в том, что количество входных данных может измениться, так как предыдущий оператор 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 не захватит идентификаторы marketGroupID, где hasTypes = 1?
Sqllite поддерживает рекурсивные запросы, которые можно использовать для иерархических запросов (это то, что вы пытаетесь сделать). Взгляните на документацию здесь В нем даже есть раздел об иерархических запросах. Таким образом, вы можете полностью заменить свой цикл одним вызовом БД и позволить ему выполнять свою работу.
С
WITH
. Найдите рекурсивные CTE.