因此,我有这个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
。
答案 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;