SQL COUNT не дает мне правильные результаты - PullRequest
0 голосов
/ 06 сентября 2018

Итак, у меня есть таблица статей, и я хочу узнать, сколько там опубликованных статей для определенного раздела, скажем, для раздела 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 голосов
/ 06 сентября 2018

Ух ты, похоже, это может быть ошибкой MySQL. Смотрите здесь:

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

Попробуйте выполнить следующее перед проверкой SQL-оператора:

SET SESSION optimizer_switch="index_merge_intersection=off";
0 голосов
/ 06 сентября 2018

SELECT count (0) как numStories ОТ noticia ГДЕ not_flgpublicar = 'S' И not_sec = 1;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...