【问题标题】:Referencing a past query in a loop SQLite在循环 SQLite 中引用过去的查询
【发布时间】:2021-04-10 00:50:51
【问题描述】:

我想将来自 for 循环的查询的两个或多个结果相交

我的代码从命令行接收字符串,并检查数据库中匹配演员的电影

电影数据库

标识 |名字

演员数据库

标识 |名字

演戏

movie_id |演员 ID 即

inp = sys.argv[1]

query = 
'''
SELECT m.name 
FROM movie m
    JOIN acting ag on m.id = ag.movie_id
    JOIN actor a on a.id = ag.actor_id
WHERE a.name = ?
'''

cur.execute(query, (inp,))
for tup in cur.fetchall:
    print(tup)

这个程序会得到演员大卫的所有电影

./program "David'

The Secret Life of Pets
The Big Short
Concussion
A Most Violent Year 
Baggage Claim
Skyfall 
Drive 
Albert Nobbs 
The Book of Eli 
Shine a Light 
The Bourne Ultimatum 
The Simpsons Movie 


我想扩展我的程序以接受多个参数,接受多个演员姓名,演员在同一部电影中表演。

可能的代码?

for index in range(len(sys.argv - 1)):
    # insert code here

我认为我应该使用查询输出的交集,但我不知道该怎么做。

这是艾伯特和大卫的电影输出

./program "Albert" "David"
A Most Violent Year 
Baggage Claim 
The Simpsons Movie

【问题讨论】:

    标签: sqlite


    【解决方案1】:

    您可以使用聚合来构造一个查询,该查询返回您作为参数传递的所有演员的共同电影:

    query = """
    SELECT m.name 
    FROM movie m
    JOIN acting ag on m.id = ag.movie_id
    JOIN actor a on a.id = ag.actor_id
    WHERE ',' || ? || ',' LIKE '%,' || a.name || ',%'
    GROUP BY m.id, m.name
    HAVING COUNT(*) = ?
    """
    cur = con.cursor()
    cur.execute(query, (','.join(sys.argv[1:]), len(sys.argv)-1))
    for tup in cur.fetchall():
        print(tup[0])
    

    【讨论】:

    • 谢谢您的回答,请您解释一下。我不明白为什么 where 子句中有这么多逗号,以及为什么它是像 a.name 这样的变量,而不是像变量那样的 a.name,尽管我不确定这是否重要。另外,为什么我们同时按 m.id 和 m.name 分组
    • @MichaelQiao 此查询将应用程序的参数作为逗号分隔的字符串传递,例如 "Albert,David"(这是 ','.join(sys.argv[1:]) 所做的)并使用运算符 LIKE 检查该字符串是否为 LIKE演员的名字(包含名字)。我对 m.id 和 m.name 都进行了分组,以防万一有 2 部电影同名(这是可能的)。如果有这种情况,那么您还应该选择 m.id 而不仅仅是 m.name。
    • 感谢您的解释!因此,因为我们使用 like 而不是 =,所以代码是否应该与 ./program "alb" "dav" 一样工作?我试过了,但它没有输出同样的东西。
    • @MichaelQiao 不,当传递了多个部分名称时,这不起作用。它仅适用于您对 1 个部分名称的原始查询:WHERE a.name LIKE '%' || ? || '%'。
    • @MichaelQiao 这是一个不同的要求,如果在 SQLite 中实现,则需要递归查询,如果在 Python 中实现,则需要循环。无论如何,对于新要求,您都应该提出新问题。
    猜你喜欢
    • 2020-08-21
    • 1970-01-01
    • 1970-01-01
    • 2018-06-24
    • 1970-01-01
    • 2012-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多