如何在Python+MySQL中统计指定10个用户未来月份的存款总额?
解决方案
先修正你原SQL的语法问题
你第二步的查询语句里写了两个WHERE,这会导致语法错误,应该用AND连接所有条件,示例:
select sum(RealCash) from bank where Status=1 and TransactionType=4 and date between 'June' and 'July'
方法一:用SQL子查询直接关联(推荐,效率更高)
不需要在Python中存储用户ID变量,直接通过子查询一步完成统计,同时满足“未来月份”的条件(假设未来月份是指July之后的时间,可根据实际日期格式调整):
SELECT SUM(RealCash) FROM bank WHERE Status = 1 AND TransactionType = 4 AND date > 'July' -- 替换为实际的未来月份起始日期,比如'2024-08-01' AND UserId IN ( SELECT UserId FROM Users WHERE Depositor BETWEEN 'June' AND 'July' )
注意:如果
Depositor和date是日期类型字段,不要用'June'这种字符串,应该用标准日期格式(比如'2024-06-01'和'2024-07-31'),避免字符串比较的逻辑错误。
方法二:通过Python传入用户ID列表(参数化查询,避免SQL注入)
如果你已经把第一步的用户ID存入了result变量(比如一个Python列表),可以用参数化查询的方式将ID列表传入SQL,确保安全性:
import pymysql # 数据库连接配置(根据你的实际情况修改) db_config = { 'host': 'localhost', 'user': 'your_username', 'password': 'your_password', 'database': 'your_db_name' } # 第一步得到的用户ID列表 result = [1, 2, 3, ..., 10] # 替换为实际的ID集合 # 建立连接并执行查询 with pymysql.connect(**db_config) as conn: with conn.cursor() as cursor: # 构造IN语句的占位符,数量和ID列表长度一致 placeholders = ', '.join(['%s'] * len(result)) sql = f""" SELECT SUM(RealCash) FROM bank WHERE Status = 1 AND TransactionType = 4 AND date > 'July' -- 替换为实际的未来月份起始日期 AND UserId IN ({placeholders}) """ # 执行查询,传入ID列表作为参数 cursor.execute(sql, result) total_amount = cursor.fetchone()[0] print(f"指定用户未来月份存款总额: {total_amount}")
关键点:必须用参数化查询,不要直接将ID拼接进SQL字符串,否则会存在SQL注入风险。
内容的提问来源于stack exchange,提问作者Yog
相关产品推荐
相关产品推荐

