使用双SELECT语句时无法插入到独立列的问题排查
问题分析与修复方案
咱们一步一步拆解你遇到的问题,核心是两个代码错误加上一个SQL写法的隐患:
1. 循环迭代对象写错,导致ADDRESS数据根本没被插入
你处理ADDRESS插入的逻辑里,明明已经把查询结果存在了records1里,但循环的时候却写成了for i in records:——这里的records是之前查询NAME得到的结果集!这就意味着你完全没遍历ADDRESS的查询结果,反而把NAME的数据又重复处理了一遍。
修复方法:把第二个循环改成遍历records1:
for i in records1: address = i[0] query = "INSERT INTO sorting_report(ADDRESS) VALUES (%s)" parameters = (str(address),) cursor.execute(query, parameters)
2. GROUP BY 写法不规范,导致NAME列混入非预期数据
你的两个SELECT语句都用了GROUP BY PAGE,但直接SELECTENTITY的写法不符合SQL标准(MySQL在非严格模式下允许,但结果不可控)。当你GROUP BY某个列,但SELECT的列不在GROUP BY里也没有聚合函数时,MySQL会随机返回分组里的某一条记录。
你说NAME列出现了本该属于ADDRESS的Newyork、London,大概率是两种情况:
- 你的
annotate1表中,这些地址记录的LABEL被错误标记成了NAME; - 如果每个PAGE对应唯一的NAME/ADDRESS,完全可以去掉GROUP BY(GROUP BY在这里是多余的);如果一个PAGE有多个同LABEL的ENTITY,建议用
GROUP_CONCAT合并内容,比如:
SELECT GROUP_CONCAT(ENTITY SEPARATOR ', ') FROM annotate1 WHERE LABEL = 'NAME' GROUP BY PAGE
额外优化建议
- 不需要创建多个cursor,一个cursor对象就可以复用执行不同SQL,删掉
cursor1 = mydb.cursor()这行就行; - 可以把重复的插入逻辑封装成函数,减少冗余:
def insert_data(cursor, label, column): query = f"SELECT ENTITY FROM annotate1 WHERE LABEL = '{label}' GROUP BY PAGE" cursor.execute(query) records = cursor.fetchall() for i in records: value = str(i[0]) insert_query = f"INSERT INTO sorting_report({column}) VALUES (%s)" cursor.execute(insert_query, (value,)) # 调用函数插入数据 insert_data(cursor, 'NAME', 'NAME') insert_data(cursor, 'ADDRESS', 'ADDRESS') mydb.commit()
内容的提问来源于stack exchange,提问作者Ajay kk
相关产品推荐
相关产品推荐

