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_pa​​cket = 1000000000;

2) ID 不包含空值

3) ID 名称 = 'StockID'

【问题讨论】:

为什么要添加硬编码的条件值?它们太多,无法硬编码。 抱歉,我打字很快,我错过了查询中的一些重要部分,我已经修改了问题。 @AnkitJaiswal @Lamar,当然,手动输入所有 8000 个元素会很麻烦。我正在使用 Vb.net 循环 a 中的所有元素并将其输出到列表中。跨度> 我的意思是您的方法可能是错误的方法。尝试将这些值保存在表格或其他内容中,或者尝试将这些值减少到更少的范围或类别。 @RyanTan 我认为 NOT IN 除了 max_allowed_pa​​cket 之外没有限制。 【参考方案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) 条件在超过一定数量的元素后无法正确返回的主要内容,如果未能解决你的问题,请参考以下文章

Python 操作Redis

python爬虫入门----- 阿里巴巴供应商爬虫

Python词典设置默认值小技巧

《python学习手册(第4版)》pdf

Django settings.py 的media路径设置

Python中的赋值,浅拷贝和深拷贝的区别