sqlite, фильтровать строки с динамическим количеством ключей, но только если они имеют одинаковое значение в определенном столбце? - PullRequest
0 голосов
/ 16 февраля 2019

Я новичок в sqlite (и базы данных в целом).Я сделал много чтения как здесь, так и в других местах, и я не могу найти эту конкретную проблему.Люди стремятся к подсчетам или дубликатам.Мне нужно отфильтровать.

У меня есть база данных с 3 столбцами (и несколькими сотнями тысяч записей)

column1 column2 column3
abc     123     @#$
egf     456     $%#
abc     321     !@#
kop     123     &$%    
pok     321     ^$#

и т. Д.

Что я пытаюсь сделатьсделать это.Мне нужно получить все возможные комбинации списка.Например,

[123, 321]

все возможные комбинации будут

[123],[321],[123,321]

Я не знаю, какой ввод может быть, это может быть больше 2 строк, и поэтому список комбинаций может увеличиватьсядостаточно быстро.Для отдельных записей выше, таких как 123, 321, он работает вне шлюза, я пытаюсь заставить работать с более чем одним значением в списке.

Так что я динамически генерирую оператор выбора

sqlquery = "SELECT fileloc, frequency FROM words WHERE word=?"
    while numOfVariables < len(list):
        sqlquery += " or word=?"
        numOfVariables += 1

Это генерирует запрос, затем я выполняю его с

cursor.execute(sqlquery,tuple(list))

, который работает.Он находит меня во всех строках с любой из этих комбинаций.

Теперь мне нужна еще одна вещь, мне нужно ТОЛЬКО выбрать их, если их column1 совпадает (я не знаю, какое это значение может быть).

Таким образом, в приведенном выше примере он выберет строки 1 и 3, поскольку их столбец2 содержит значения, которые меня интересуют, а их столбец1 совпадает.Но столбец 4 не будет выбран, даже если он имеет значение, которое мы хотим.Потому что его column1 не соответствует 321 column1.То же самое для строки 5, опять же, хотя это одно из значений, которое нам нужно, его column1 не соответствует 123.

Из того, что я смог найти, люди сравнивают с конкретным значением с помощью GROUP BY.Но в моем случае я не знаю, что это может быть за значение.Все, что меня волнует, это то же самое, если оно одинаково между строками или нет.

Извините, если мое объяснение не ясно.Я никогда не использовал mysql до этой недели, поэтому я не знаю всех технических терминов.

Но в основном мне нужна функциональность (псевдокод):

if (column2 is 123 or 321) and 123.column1 == 321.column1:
       count
   else:
       dont count

У меня такое чувство, что это можетбыть сделано, сначала переместив все, что соответствует 123 или 321 в новую таблицу.Затем просматриваем эту таблицу и сохраняем только записи с 123 и 321 с одинаковым значением column1.Но я не уверен, как это сделать или если это правильный подход?Поскольку эта вещь будет масштабироваться довольно быстро, если имеется 5 входов, то сохраняются строки, если есть одна строка для учета каждого входа, и все их столбцы column1 одинаковы.(Таким образом, строки будут сохранены в наборах по 5).

Спасибо.

(я использую Python 2.7.15)

1 Ответ

0 голосов
/ 16 февраля 2019

Вы писали:

  • "Мне нужно получить все возможные комбинации списка"

  • "СейчасМне нужна еще одна вещь, мне нужно ТОЛЬКО выбрать их, если их column1 совпадает с (я не знаю, каково это значение).

ИспользованиеСамостоятельное присоединение для этой цели:

SELECT W1.column2, W2.column2 
   FROM words W1 
        JOIN words W2 ON W1.column1 = W2.column1

Поправьте меня, если я что-то упустил в вашем вопросе, но этих трех строк должно быть достаточно.

Python выглядит неуместно для вашего вопроса. Это может бытьрешено в чистом SQL

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