mysql子查询和python集

mysql子查询和python集,python,mysql,set,subquery,Python,Mysql,Set,Subquery,因此,我通过python包装器运行mysql脚本,但重要的部分在这里。我的目标是看哪个更快,进行两个单独的select DISTINCT()调用,并找到列表a中不在列表b中的那些调用。我还使用子查询来实现这一点 我发现子查询的速度要快得多(正如所希望的那样),但是它产生的结果是错误的 starttime1 = time.time() LoLs.cursor.execute("SELECT DISTINCT(Id) FROM participants") drop = cursor.fetchal

因此,我通过python包装器运行mysql脚本,但重要的部分在这里。我的目标是看哪个更快,进行两个单独的select DISTINCT()调用,并找到列表a中不在列表b中的那些调用。我还使用子查询来实现这一点

我发现子查询的速度要快得多(正如所希望的那样),但是它产生的结果是错误的

starttime1 = time.time()
LoLs.cursor.execute("SELECT DISTINCT(Id) FROM participants")
drop = cursor.fetchall()
drop = [x[0] for x in drop]
LoLs.cursor.execute("SELECT DISTINCT(Id) FROM history")
exist = cursor.fetchall()
exist = [x[0] for x in exist]
drop1 = list(set(drop)-set(exist))
endtime1 = time.time()
print len(drop1)

print endtime1 - starttime1
这导致:

545594
205.518273115
427333
185.753734112
正如所料

然而:

starttime2 = time.time()
cursor.execute("SELECT DISTINCT(Id) FROM participants where Id NOT IN (SELECT DISTINCT(Id) FROM history)")
drop2 = cursor.fetchall()
drop2 = [x[0] for x in drop2]
drop2 = list(set(drop2))
endtime2 = time.time()
print len(drop2)

print endtime2 - starttime2
结果:

545594
205.518273115
427333
185.753734112
它的速度快得多,很棒,但结果只有427333个条目,而不是545594个条目

作为说明,我对两个结束列表做了一个设置差异 打印透镜(列表(集合(drop1)-集合(drop2)))

结果: 118261

因此,第一个列表中有118261个不在第二个列表中的唯一条目。我甚至拿了其中一些,手动检查它们是否在历史记录表中,它们确实在历史记录表中,所以子查询应该已经捕捉到了它们

注3月6日:已更改:

 cursor.execute("SELECT DISTINCT(Id) FROM participants where summonerId NOT IN (SELECT DISTINCT(Id) FROM history)")

准确反映真实问题。

。请尝试:

cursor.execute("""SELECT DISTINCT(Id) 
                  FROM participants p
                  WHERE NOT EXISTS (SELECT 1
                                    FROM history h
                                    WHERE h.Id = p.summonerId)""")

仍然存在相同的问题,因为两个id都必须为非null。所以空值不存在