MySQL (NOT IN) 条件在超过一定数量的元素后无法正确返回
Posted
技术标签:
【中文标题】MySQL (NOT IN) 条件在超过一定数量的元素后无法正确返回【英文标题】:MySQL (NOT IN) Condition does not return correctly after exceeding certain number of elements 【发布时间】:2018-08-13 06:31:45 【问题描述】:Select * From Table_Name Where MyColumnID NOT IN (1,2,3,4,5);
上面的 sql 语句工作得很好,但是当我尝试增加元素时
Select * From Table_Name Where MyColumnID NOT IN (1,2,3,4,5,...1000 and more);
它只返回几行,有时根本不返回。任何数量小于 1000 的元素都会正确返回 NOT IN 条件
然后,我尝试使用 IN 条件如下:
Select * From Table_Name Where MyColumnID IN (1,2,3,4,5,...9000 and more);
它工作得很好,正如预期的那样。如果它适用于 IN 条件,为什么它不适用于 NOT IN 条件?
我真的很茫然,难道我在某个地方错过了一些变量吗?
我已设置或检查的内容:
1) Max_allowed_packet = 1000000000;
2) ID 不包含空值
3) ID 名称 = 'StockID'
【问题讨论】:
为什么要添加硬编码的条件值?它们太多,无法硬编码。 抱歉,我打字很快,我错过了查询中的一些重要部分,我已经修改了问题。 @AnkitJaiswal @Lamar,当然,手动输入所有 8000 个元素会很麻烦。我正在使用 Vb.net 循环 a 中的所有元素并将其输出到列表中。跨度> 我的意思是您的方法可能是错误的方法。尝试将这些值保存在表格或其他内容中,或者尝试将这些值减少到更少的范围或类别。 @RyanTan 我认为 NOT IN 除了 max_allowed_packet 之外没有限制。 【参考方案1】:看起来您可能遇到了一个非常古老的错误,您将不得不升级您的 mysql 版本。
见
https://bugs.mysql.com/bug.php?id=15872
如果您阅读报告的底部,您会发现此错误已在 5.0.25 中修复
[15 Aug 2006 17:08] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:
http://lists.mysql.com/commits/10495
ChangeSet@1.2257, 2006-08-15 21:08:22+04:00, sergefp@mysql.com +3 -0
BUG#21282: Incorrect query results for "t.key NOT IN (<big const list>)
In fix for BUG#15872, a condition of type "t.key NOT IN (c1, .... cN)"
where N>1000, was incorrectly converted to
(-inf < X < c_min) OR (c_max < X)
Now this conversion is removed, we dont produce any range lists for such
conditions.
[29 Aug 2006 13:23] Evgeny Potemkin
Fixed in 5.0.25
[4 Sep 2006 11:41] Evgeny Potemkin
Fixed in 5.1.12
【讨论】:
就是这样!我应该更彻底。感谢保罗的指导。 当问题似乎没有任何意义时,特别是对于非常旧的产品版本,总是值得扫描错误数据库。您会升级解决这个问题的方法还是采用@lamar 建议的方法,这对我来说似乎很明智? 非常感谢您的建议!是的,我将升级到更高版本,并且我无意将我的问题中的此类方法实施到系统中(这被证明是低效的)。只是想知道为什么我没有得到预期的结果。再次感谢。以上是关于MySQL (NOT IN) 条件在超过一定数量的元素后无法正确返回的主要内容,如果未能解决你的问题,请参考以下文章