我对sqlite(和一般的数据库)是全新的。我在这里和其他地方都读了很多书,但找不到这个具体的问题。人们往往想要数数或重复。我需要过滤。
我有一个包含3列(和数十万个条目)的数据库
column1 column2 column3
abc 123 @#$
egf 456 $%#
abc 321 !@#
kop 123 &$%
pok 321 ^$#
我要做的就是这个。我需要检索一个列表的所有可能组合。例如
[123, 321]
所有可能的组合都是
[123],[321],[123,321]
我不知道可能的输入是什么,它可以是2个以上的字符串,所以组合列表可以快速增长。对于上面的单个条目,比如123321,它在gate之外工作,我要做的是在列表中使用超过1个值。
所以我动态地生成select语句
sqlquery = "SELECT fileloc, frequency FROM words WHERE word=?"
while numOfVariables < len(list):
sqlquery += " or word=?"
numOfVariables += 1
这将生成查询,然后使用
cursor.execute(sqlquery,tuple(list))
这很管用。它可以找到所有包含这些组合的行。
现在我还需要一件事,我需要它只在列1相同的情况下选择它们(我不知道这个值可能是什么)。
所以在上面的例子中,它会选择第1行和第3行,因为它们的column2具有我感兴趣的值,而它们的column1是相同的。但是列4不会被选中,即使它有我们想要的值。因为它的column1与321的column1不匹配。第5行也是一样,尽管它是我们需要的值之一,但它的column1与123的不匹配。
如果我的解释不清楚,我很抱歉。我这周以前从未使用过mysql,所以我不知道所有的技术术语。
但基本上我需要(伪代码)的功能:
if (column2 is 123 or 321) and 123.column1 == 321.column1:
count
else:
dont count
我有一种感觉,这可以通过首先移动匹配123或321到一个新的表。然后遍历该表,只保留具有相同column1值的123和321的记录。但我不知道该怎么做,或者这是不是正确的方法?因为这个东西会很快扩展,如果有5个输入,那么保留的行是,如果每个输入有一行,并且它们的所有column1都是相同的。(因此行将以5为一组保存)。
(我使用的是Python2.7.15)