Python MySQL使用一条语句执行多个类似的select查询

Python MySQL使用一条语句执行多个类似的select查询,python,mysql,select,mysql-connector-python,Python,Mysql,Select,Mysql Connector Python,我目前正在使用MySQL连接器/Python查询数据库 目前,我正在执行的一个流程如下所示: SELECT some_column FROM some_table WHERE some_column_2 = foo_1; SELECT some_column FROM some_table WHERE some_column_2 = foo_2; SELECT some_column FROM some_table WHERE some_column_2 = foo_3; ... SELECT

我目前正在使用MySQL连接器/Python查询数据库

目前,我正在执行的一个流程如下所示:

SELECT some_column FROM some_table WHERE some_column_2 = foo_1;
SELECT some_column FROM some_table WHERE some_column_2 = foo_2;
SELECT some_column FROM some_table WHERE some_column_2 = foo_3;
...
SELECT some_column FROM some_table WHERE some_column_2 = foo_9999;
SELECT some_column FROM some_table WHERE some_column_2 = foo_10000;
我正在运行大量非常类似的查询

每个查询的单独结果都很重要。即使给定查询的结果没有任何结果

不幸的是,目前这样进行数千次查询的方法非常耗时且效率极低

所以,我的问题是:有没有办法将这个过程压缩成一个查询,这样它就能更高效地运行

我觉得这在MySQL中应该是完全可能的,我很确定我在这里遗漏了一些东西


到目前为止,我已经尝试使用MySQL Connector/Python的executemany()函数,如下所示:

cursor.executemany("SELECT some_column FROM some_table WHERE some_column_2 = %s", foo_list)
我希望这会为每个查询生成一个结果列表,但会优化尽可能多的查询。不幸的是,这在MySQL连接器/Python中似乎不起作用,并导致语法错误

我猜executemany不是用于SELECT语句,而是用于INSERT语句


我也在互联网上搜索过执行批量选择查询的方法,但我还没有找到任何与我的情况相关的方法

我想明确指出这一点

SELECT some_column FROM some_table WHERE some_column_2 IN (foo_1, foo_2, foo_3, etc);
不是有效的解决方案,因为它不会保留每个查询的结果(或缺少结果)


欢迎对此提供任何帮助。

而不是

从某个_表中选择某个_列(foo_1,foo_2,…,foo_N),其中包含某个_列(foo_1,foo_2,…,foo_N)

索求

SELECT some_column, some_column_2 FROM some_table WHERE some_column_2 IN (foo_1, foo_2, ..., foo_N);
生成查询的代码知道foo 1..N值,并将在第2列结果中看到它们的子集


另外,在中使用
通常是一种反模式,这会干扰mysql优化器创建良好计划的能力。对于一个大型的
IN
子句,您可能会发现最好是不辞辛劳地填充
FOO
表,然后加入到表中来。我接受了J H的答案,因为它提供了我要查找的信息。不过,我也会将此作为他们建议的具体实施:

cursor.execute("CREATE TABLE foo_table (foo VARCHAR(20))")
insert_query = "INSERT INTO foo_table (foo) VALUES (%s)"
cursor.executemany(insert_query, foo_list)
select_query = "SELECT some_table.some_column FROM some_table RIGHT JOIN foo_table on some_table.foo = foo_table.foo GROUP BY 1"
cursor.execute(select_query)
这似乎起到了预期的作用


编辑:由于某种原因,python MySQL Connector/python中的游标对象将只是ommit“null”值,因此仍然需要将“some_column”和“foo”值配对。因为,在我的例子中,每个“some\u column”值对于每个“foo”值都是完全唯一的,所以我可以使用任何一个值()来实现这一点。

是的,效率更高的东西会更有效。请参见为什么不使用单选择查询获取
some\u column\u 2
,并显式地将(使用dict)“some\u column\u 2”与相应的“some_column”?如果您将foo的值保存到数据库中的其他位置,那么您可以将其视为透视表。我决定创建一个新表并使用JOIN语句。这似乎是最好的操作方法。感谢您为我指出了正确的方向(我对MySQL非常陌生)
groupby1
有点奇怪,我想它是通过
groupbysome_column
实现的,我希望它有一个唯一的索引,或者至少有一个索引。我强烈建议添加一个PK:
createtable foo_TABLE(foo VARCHAR(20)主键)
。一般来说,每个关系都应该有一个主键,即使它是跨越几列的复合键。对于此特定联接,您确实希望优化器在确定哪个将成为驱动表时利用唯一索引。请使用EXPLAIN验证联接子句是否有意义。()使用主键在优化方面更好?很高兴知道,谢谢。我对MySQL不是很熟悉。