我已经玩了几个小时的Python和SQlite(第一次学习)。我想为一些文件创建一个标记数据库,并使用AND / OR操作过滤掉标记。简单的解决方案:
taglist = ['tag1', 'tag2']
rows = c.execute("SELECT DISTINCT * FROM tags WHERE tag=? OR tag=?", [taglist[0], taglist[1]])
for row in rows:
#do stuff
问题是,这限制了我在SQL查询中放置的许多AND / OR语句的标准(在本例中为两个)。如何输入可变数量的标准,以便用户可以根据自己的喜好选择多少个标签?
编辑:我设法将某些东西放在一起,但它看起来并不优雅。我无法弄清楚如何获得"标签列表"列入SQL查询。它期望一个字符串,而不是一个列表,甚至将列表转换为字符串似乎不起作用。我最终将它连接到SQL查询字符串。
以下是我提出的和可变数量的标签在一起的内容。它首先执行OR子查询以获取具有匹配标记的所有id,然后执行COUNT以过滤出与查询的标记数量相同的次数的COUNT。如果ID小于此值,则不会在标记列表中指定所有标记。
taglist = ('tag1','tag2')
tagstring = str(taglist)
tagcount = len(taglist)
rows = c.execute("SELECT id FROM (SELECT * FROM tags WHERE tag IN " + tagstring + ") GROUP BY id HAVING COUNT(id)=(?)", [tagcount])
这似乎有效,但我无法帮助,但认为有更好的方法吗?
答案 0 :(得分:0)
我不知道python,但是对于它的SQL方面,你会想要查看IN子句。
你需要仔细检查python,这是我可以通过快速搜索语法收集的内容。 (对于SQL语句构建器语法,我只使用了代码中的内容,可能有更简洁的方法)。
taglist = ['tag1', 'tag2']
s = ""
for i in range(len(taglist)):
s+=str(taglist[i])
rows = c.execute("SELECT DISTINCT * FROM tags WHERE tag IN ( ? )", [s])
for row in rows:
#do stuff