代码之家  ›  专栏  ›  技术社区  ›  Duxa

sqlite,使用动态键数筛选行,但前提是它们在特定列中具有相同的值?

  •  0
  • Duxa  · 技术社区  · 6 年前

    我对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)

    0 回复  |  直到 6 年前
        1
  •  0
  •   Alex Yu    6 年前

    你写道:

    • “我需要找回 “一个列表”

    • “现在我还需要一件事,我需要它来选择他们 第1栏是一样的

    为此,请使用self join:

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

    Python看起来与您的问题无关。它可以用纯SQL来解决