'in'和'not in'计数不加起来 - 出了什么问题?

Igo*_*any 2 mysql sql

我有一些服务器.他们中的一些人分配了ips.我想弄清楚有多少没有.显然有更多的服务器比分配的ips,但我的数据库告诉我没有分配ips的服务器...

我在这里结束了我的智慧.我的数据库是否以某种奇怪的方式被破坏了?

SELECT COUNT(*) 
  FROM server
Run Code Online (Sandbox Code Playgroud)

...的回报:

+----------+
| count(*) |
+----------+
|    23088 | 
+----------+
1 row in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

这个:

SELECT COUNT(*) 
  FROM server 
 WHERE server_id IN (SELECT DISTINCT(server_id) 
                       FROM ips)
Run Code Online (Sandbox Code Playgroud)

...的回报:

+----------+
| count(*) |
+----------+
|    13811 | 
+----------+
1 row in set (0.01 sec)
Run Code Online (Sandbox Code Playgroud)

这个:

SELECT COUNT(*) 
  FROM server 
 WHERE server_id NOT IN (SELECT DISTINCT(server_id) 
                           FROM ips);
Run Code Online (Sandbox Code Playgroud)

...的回报:

+----------+
| count(*) |
+----------+
|        0 | 
+----------+
1 row in set (0.02 sec)
Run Code Online (Sandbox Code Playgroud)

结果已被编辑以保护有罪,但你明白了.

  • 所有表都是InnoDB.
  • Check table 在这两个表上都返回ok.

编辑:谢谢您使用的建议LEFT JOIN.这肯定证实问题是MySQL错误.

mysql> SELECT count(s.server_id) FROM server s LEFT JOIN ips i on s.server_id = i.server_id WHERE i.server_id IS NULL;
+--------------------+
| count(s.server_id) |
+--------------------+
|               9277 | 
+--------------------+
1 row in set (0.04 sec)
Run Code Online (Sandbox Code Playgroud)

由于9277 + 13811 = 23088,这意味着所有没有ips的服务器+所有带有ips的服务器确实==所有服务器.

我计划在下周开始升级mysql服务器.敬请关注.

tru*_*ppo 7

什么版本的MySQL?似乎<5.0.25/5.1.12中的错误可能是罪魁祸首:

错误#21282:NOT IN,超过1000返回错误的结果与INDEX:

SELECT ... WHERE some_field NOT IN (...)如果在some_field上有INDEX/UNIQUE键,则在NOT IN部分中使用a 然后1000或更多值会导致服务器返回不正确的结果.少于1000个标准正常工作.


Nes*_*cio 6

你的专栏里有空吗?