SQL COUNT没有给我正确的结果

时间:2018-09-06 16:24:40

标签: mysql sql

因此,我有这个Articles表,并且我想查找特定部分(例如第1部分)的已发布文章数。这是我使用的SQL:

  SELECT count(*) as numStories 
   FROM noticia WHERE not_flgpublicar = 'S' AND not_sec = 1;

以及我得到的结果:

+------------+
| numStories |
+------------+
|          0 |
+------------+

但这是不对的,因为我知道该部分存在,并且该部分中有几篇已发表的文章。实际上,我使用哪个部分都没有关系,SQL总是返回零计数!

然后我这样做了:

 SELECT not_sec, count(*) as numStories 
 FROM noticia WHERE not_flgpublicar='S' GROUP BY not_sec;

我得到的结果是

+---------+------------+
| not_sec | numStories |
+---------+------------+
|    NULL |          8 |
|       0 |       3583 |
|       1 |      20151 |
|       2 |      15979 |
|       3 |       8233 |
|       4 |       8406 |
|       5 |       3493 |
|       6 |       3952 |
|       7 |       1237 |
|       8 |       1213 |
|       9 |        108 |
|      11 |         44 |
|      12 |         12 |
+---------+------------+

您可以看到,每个部分都有几篇文章,但是第一个SQL语句仍然无法使用。我找到了一种通过执行以下操作获得正确计数的方法:

SELECT count(*) as numStories 
FROM noticia WHERE not_flgpublicar='S' GROUP BY not_sec HAVING not_sec = 1;

哪个(最终)返回:

+------------+
| numStories |
+------------+
|      20151 |
+------------+

但是我真的非常想知道为什么第一个SQL语句不起作用,因为据我了解,它应该起作用。

有什么想法吗?这真的让我大吃一惊。

编辑-更多信息:not_sec字段类型为int(11),而not_flgpublicar字段类型为char(1)。引擎是MySQL v.5.6.41。该表结构具有50多个字段,因此在这里我很犹豫。

编辑2-更奇怪。当我尝试查找未发表的故事(not_flgpublicar等于'N')时,它会起作用:

mysql> SELECT count(*) as numStories 
          FROM noticia 
          WHERE not_flgpublicar = 'N' AND not_sec = 1;
+------------+
| numStories |
+------------+
|         12 |
+------------+
1 row in set (0.00 sec)

但是,如果我尝试查找已发布的内容,它仍然不起作用:

mysql> SELECT count(*) as numStories 
          FROM noticia 
          WHERE not_flgpublicar = 'S' AND not_sec = 1;
+------------+
| numStories |
+------------+
|          0 |
+------------+
1 row in set (0.02 sec)

我什至尝试过:

mysql> SELECT count(*) as numStories 
          FROM noticia 
          WHERE not_flgpublicar LIKE 'S' AND not_sec = 1;
+------------+
| numStories |
+------------+
|          0 |
+------------+
1 row in set (0.02 sec)

但是,如果我这样做:

mysql> SELECT count(*) as numStories 
          FROM noticia 
          WHERE not_flgpublicar LIKE '%S' AND not_sec = 1;
+------------+
| numStories |
+------------+
|      20151 |
+------------+
1 row in set (0.02 sec)

...有效。

not_flgpublicar字段是char(1),因此该字段中不能有多个字符(我检查过)。所有字段的归类均为utf8mb4_unicode_ci

2 个答案:

答案 0 :(得分:1)

哇,看起来这实际上可能是MySQL错误。看到这里:

https://bugs.mysql.com/bug.php?id=81031

在您的SQL语句之前尝试以下操作进行验证:

SET SESSION optimizer_switch="index_merge_intersection=off";

答案 1 :(得分:0)

选择count(0)作为numStories    从noticia那里not_flgpublicar ='S'并且not_sec = 1;