Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL中传入IN()的最大项数是多少_Mysql_Sql - Fatal编程技术网

MySQL中传入IN()的最大项数是多少

MySQL中传入IN()的最大项数是多少,mysql,sql,Mysql,Sql,我收到了一堆来自外部来源的ID,我需要与数据库中的ID进行交叉引用,并过滤掉那些介于某个日期之间、也已启用的ID和一些其他参数。我可以通过以下方式轻松做到这一点: SELECT * FROM `table` WHERE `id` IN (csv_list_of_external_ids) AND (my other cross-reference parameters); 通过这样做,在所有传入的ID中,我将得到我想要的ID。但显然,当外部ID达到数千个时,这不是一种非常有效的方法。

我收到了一堆来自外部来源的ID,我需要与数据库中的ID进行交叉引用,并过滤掉那些介于某个日期之间、也已启用的ID和一些其他参数。我可以通过以下方式轻松做到这一点:

SELECT * FROM `table` WHERE `id` IN (csv_list_of_external_ids) 
    AND (my other cross-reference parameters);
通过这样做,在所有传入的ID中,我将得到我想要的ID。但显然,当外部ID达到数千个时,这不是一种非常有效的方法。我不确定MySQL是否会支持如此庞大的查询


由于用户数据和外部ID在每次查询中都会发生很大的变化,因此无法缓存任何内容,并且这些查询至少每10秒发生一次。还有其他SQL替代方案吗?

我认为唯一的限制是实际查询的长度,它由my.cnf文件中的max_allowed_packet参数控制。

如果将其表示为子查询:

SELECT * FROM table
WHERE id IN (SELECT ID FROM SOME_OTHER_TABLE)
AND ...

没有限制

问题是我无法控制该参数。然后您只需要确保您的查询长度小于设置的限制。一种方法可能是使用多个insert语句将in子句中的所有值插入到临时表中,然后在查询中使用一个子选择:WHERE id INSELECT id FROM temp_table by temporary table您的意思是使用内存作为表的引擎吗?您可以在内存中或磁盘上执行,以您喜欢的方式执行。内存可能也一样好,因为您的唯一目标是围绕最大查询大小工作。我刚刚对临时表做了一些快速研究,这些正是我所需要的。谢谢我的问题是子查询中的ID作为字符串从外部源传递给我,这是来自另一个提供者的API调用