Подсчет записей с исключением одной категории при связи один-ко-многим

Фанат

oncle terrible
Команда форума
Что-то я туплю.
Попробую сформулировать - авось, прояснится.

Задача - посчитать количество новостей, исключая входящие в определённую котегорию.
Посчитать включая её - несложно
PHP:
select count(1) from categories c, news n WHERE n.id=c.id AND category = 5;
обратная замена, разумеется, не проходит.

Собственно, вопрос: делается ли оно таки просто, а это я туплю? Или наоборот - без лома и такой-то матери по-любому не получится?
 

Gas

может по одной?
PHP:
select sum(if(category = 5,0,1)) from news n
ну или всякими извратами
PHP:
select count(1) from news n
join (select id from categories where category <> 5) as c
WHERE n.id=c.id;
 

Фанат

oncle terrible
Команда форума
Не. оно же Один Комоногим.
ту же цифру можно получить и заменив = на <>
но она будет в 5 раз больше реальной - категорий у новости больше одной
 

Gas

может по одной?
понял,
а если новость принадлежит категориям (1,2,3), а мы хотим исключить категорию 2, то эту новость нужно исключить несмотря на то что она принадлежит 1 и 3 или оставить?
 

Фанат

oncle terrible
Команда форума
блин, натурально туплю. я же его делал раньше, но потом меня куда-то не в ту степь унесло.
 

Фанат

oncle terrible
Команда форума
Gas
исключить все, которые принадлежат 2, независимо от остальных или их наличия
 

MiksIr

miksir@home:~$
Категорий у новости больше одной? Т.е. одна новость - много категорий, одна категория - много новостей? И это называется "Один ко многим"?
 

Фанат

oncle terrible
Команда форума
MiksIr
с LEFT JOIN и is null я пробовал, но что-то не пашет.
там ведь null может быть не только из-за наличия такой категории, но, скажем, если новость просто не относится ни к одной из категорий
 

MiksIr

miksir@home:~$
Если она не относится ни к одной категории - она не относится к категории 5. Т.е. условию задачи удовлетворяет. Или уточняйте.
И к слову, если уж делаете многие-ко-многим, то именуйте поля соответсвующе, news_id, category_id.

Код:
mysql> select * from news n,categories c where n.id=c.id;
+------+------+----------+
| id   | id   | category |
+------+------+----------+
|    1 |    1 |        1 |
|    1 |    1 |        2 |
|    1 |    1 |        3 |
|    2 |    2 |        1 |
|    2 |    2 |        5 |
|    3 |    3 |        1 |
|    3 |    3 |        5 |
|    4 |    4 |        1 |
|    4 |    4 |        2 |
|    5 |    5 |        1 |
|    5 |    5 |        2 |
+------+------+----------+
11 rows in set (0.00 sec)

mysql> select * from news n left join categories c on (n.id = c.id and c.category = 5) where c.id is null;
+------+------+----------+
| id   | id   | category |
+------+------+----------+
|    1 | NULL |     NULL |
|    4 | NULL |     NULL |
|    5 | NULL |     NULL |
+------+------+----------+
3 rows in set (0.00 sec)
Вроде все ок.
 

Фанат

oncle terrible
Команда форума
пипец. я перепутал местами новости и категории в запросе.
всё работает.
 
Сверху