MySQL IN() 列表是否有限制

Sol*_*son 2 php mysql wordpress quickbooks

我在 MySQL IN() 列表中有大约 273 个项目,我相信这会导致获取这些项目所需的所有信息时出现问题,并且不确定如何将此查询更改为仅 1 个或至少少于 273 个查询。基本上我有串的名单,我需要查询反对,并得到了NameListID,Name是273计数阵列内:

$result = $wpdb->get_results('
    SELECT Name, ListID
    FROM ' . $wpdb->prefix . 'quickbook_items
    WHERE Name IN ("' . implode('", "', array_map('addslashes', $part_names)) . '")
    ORDER BY NULL', ARRAY_A);
Run Code Online (Sandbox Code Playgroud)

我觉得我在某处读到IN过,如果列表太大,在 Wordpress中使用查询可能会出现问题,因为 Wordpress 不会获取所有数据。但我不记得这是 Wordpress$wpdb限制还是 MySQL 限制。在任何情况下,我都没有返回所有 273 行,所以我真的不确定如何执行这个查询,同时保持 db 命中低于 273 次(如果我把查询放在一个循环中,就会发生这种情况,循环通过$part_names

任何人都对如何从上quickbook_items表中查询 Name 和 ListID 提出建议?真的可以在这里使用一些帮助,或者是否有办法在查询集上没有字符限制来实现这一点?

Ale*_*rov 7

IN 条款和 max_allowed_packet

内的项目数量没有明确的限制IN (...)

但是,SQL 字符串本身的长度(以字节为单位)受max_allowed_packet系统变量值的限制。

这是MySQL 文档的摘录:

IN 列表中值的数量仅受 max_allowed_pa​​cket 值的限制。

max_allowed_pa​​cket的默认值为4 MB,因此除非您更改了该值,否则这极不可能是问题所在。此外,达到此限制会导致错误而不是错误结果。


addslashes

addslashes用于构建 MySQL 字符串文字确实不是一个好主意。考虑为此目的使用mysqli_real_escape_string


一条建议

能否请您执行以下操作来分析问题。在 上构建一个循环$part_names,并执行完全相同的语句(包括implode)——但在每次迭代中只执行一个名称。然后检查每次迭代是否返回非空结果。

通过这种方式,您将获得未返回的名称,并且可以为您提供一些线索。

另一个可能的结果是返回所有名称- 在这种情况下,问题确实可能与IN子句中的项目数有关。