Как создать цикл или способ использовать результаты предыдущих операторов SELECT в следующем операторе SELECT? - PullRequest
0 голосов
/ 29 мая 2019

У меня есть база данных с вложенной иерархической структурой.На верхних уровнях иерархии нет никаких фактических typeID (отдельных элементов), связанных с данным marketGroupID .

Вместо этого я начинаю сверху, используя поиск по строке, чтобы найти нужные категории.Мне нужно продолжать идти вниз по иерархии, используя marketGroupIDs , которые я выбрал в качестве parentGroupIDs для следующего поиска, чтобы найти все идентификаторы в этой подкатегории.Это будет делиться на несколько подкатегорий, пока столбец hasTypes = 1 (с этой подкатегорией связаны идентификаторы типов).

Пока я работаю над очень ручным вариантом: продолжайте поиск до тех пор, покаЯ добираюсь до нужного мне уровня, есть ли способ построить цикл, который поддерживает SELECTING на основе 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, захватывая marketGroupIDs, где hasTypes = 1?

1 Ответ

0 голосов
/ 29 мая 2019

Sqllite поддерживает рекурсивные запросы, которые можно использовать для иерархических запросов (что вы и пытаетесь сделать).Взгляните на документацию здесь В ней даже есть раздел об иерархических запросах.Таким образом, вы можете полностью заменить ваш цикл одним вызовом БД и позволить ему выполнить свою работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...