【发布时间】:2019-02-16 09:18:20
【问题描述】:
我是 sqlite 的新手(以及一般的数据库)。我已经在这里和其他地方进行了大量阅读,但无法找到这个具体问题。人们往往想要计数或重复。我需要过滤。
我有一个包含 3 列(以及几十万个条目)的数据库
column1 column2 column3
abc 123 @#$
egf 456 $%#
abc 321 !@#
kop 123 &$%
pok 321 ^$#
等等。
我想要做的是这个。我需要检索列表的所有可能组合。例如
[123, 321]
所有可能的组合都是
[123],[321],[123,321]
我不知道输入可能是什么,它可能超过 2 个字符串,因此组合列表可以增长得很快。对于上面的单个条目,例如 123、321,它可以直接使用,我想要使用的东西是列表中的值超过 1 个。
所以我是动态生成选择语句
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 行,因为它们的 column2 具有我感兴趣的值,并且它们的 column1 是相同的。但是即使第 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 的任何内容移动到新表中来完成。然后遍历该表并仅保留具有相同 column1 值的 123 和 321 的记录。但我不确定如何做到这一点,或者它是否是正确的方法?因为这个东西会很快扩展,如果有 5 个输入,那么保留的行是每个输入是否有一行,并且它们的所有 column1 都是相同的。 (所以行将保存在 5 组中)。
谢谢。
(我使用的是 Python 2.7.15)
【问题讨论】: