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