为什么MySQL对一个简单查询的计数不正确?

为什么MySQL对一个简单查询的计数不正确?,mysql,sql,count,Mysql,Sql,Count,我有以下疑问: SELECT COUNT(resource_id) AS num FROM resources_authors WHERE author_id=1657 这将返回正确的结果“75” 如果我将查询更改为仅搜索不同的ID: SELECT COUNT(DISTINCT resource_id) AS num FROM resources_authors WHERE author_id=1657 我得到一个较低的结果“74”,这是不正确的 但是,将该表作为资源id上的唯一索引,我已经

我有以下疑问:

SELECT COUNT(resource_id) AS num
FROM resources_authors
WHERE author_id=1657
这将返回正确的结果“75”

如果我将查询更改为仅搜索不同的ID:

SELECT COUNT(DISTINCT resource_id) AS num
FROM resources_authors
WHERE author_id=1657
我得到一个较低的结果“74”,这是不正确的

但是,将该表作为资源id上的唯一索引,我已经检查并再次检查没有重复数据。例如,我运行过:

SELECT resource_id, COUNT(resource_id) AS c
FROM resources_authors
WHERE author_id =1657
GROUP BY resource_id
ORDER BY c DESC
更奇怪的是,如果我在不正确的查询中添加一个
LIMIT
,它就会返回正确的结果!因此:

SELECT COUNT(DISTINCT resource_id)
FROM resources_authors
WHERE author_id=1657
LIMIT 0 , 100
正确返回75


我是不是碰到了错误,还是我误解了什么?这是Windows上的INNODB表MySQL 5.5.24。

这是一个。5.5.35、5.6.15和5.7.3变更日志中记录了该修复程序。

如果不使用
COUNT()
,将返回多少行<代码>从资源作者中选择资源id作为num,其中作者id-1657?资源id是唯一键中的唯一列吗?它是否可以为null,如果可以,是否有任何值为null?首先,我发现一个名为
resources\u authors
的表仅在
resource\u id
上有唯一的索引是可疑的。第二,这种行为(正如你所描述的)非常奇特。您确定表在查询运行之间没有被修改吗?参考mysql手册,它声明:COUNT(expr)返回SELECT语句检索到的行中expr的非空值数量的计数。COUNT(*)有些不同,因为它返回检索到的行数的计数,无论它们是否包含空值。COUNT(DISTINCT expr,[expr…])返回具有不同非空expr值的行数的计数。您确定没有使用
count(*)
。您能确认是否有空值吗?唯一索引实际上是绑定在一起的两列
resource\u id
author\u id
的唯一索引。当然,效果是一样的。没有可为空的列。我在本地主机上运行这个,并且100%确定数据没有被修改。