MySQL使用一个语句

时间:2017-08-10 21:48:15

标签: python mysql select mysql-connector-python

我目前正在使用MySQL Connector / 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 Connector / Python,并导致语法错误。

我猜测executemany并不适用于SELECT语句,只能用于INSERT语句。

我还在互联网上搜索了批量选择查询的方法,但我还没有找到与我的情况相关的任何内容。

我想明确指出

SELECT some_column FROM some_table WHERE some_column_2 IN (foo_1, foo_2, foo_3, etc);

是一个有效的解决方案,因为它不会保留每个查询的结果(或缺少结果)。

欢迎任何协助。

2 个答案:

答案 0 :(得分:1)

而不是

  

SELECT some_column FROM some_table WHERE some_column_2 IN(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列结果中看到它们的一部分。

作为一个单独的问题,使用IN通常是一种反模式,它会干扰mysql优化器创建好计划的能力。对于一个较大的IN子句,您可能会发现最好不要填充FOO表并加入其中。

答案 1 :(得分:0)

我接受了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中的游标对象将简单地省略" null"值,仍然需要配对" some_column"和" foo"值。因为,就我而言,每个" some_column"价值总是完全独特的每一个" foo"值,我可以使用ANY_VALUE()来做到这一点。