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

MySQL perform multiple, similar select queries with one statement

我目前正在使用 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 查询的方法,但我还没有找到与我的情况相关的任何内容。

我想明确指出

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

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


欢迎提供任何帮助。

而不是

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 table,然后反对它。

我接受了 J H 的回答,因为它提供了我正在寻找的信息。但是,我也会 post 这作为他们建议的具体实施:

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() 来做到这一点。