Помогите, пожалуйста, с запросом.

lanka

Новичок
Помогите, пожалуйста, с запросом.

Простой менеджер ссылок.
Есть таблица подкатегорий ссылок и собственно ссылок
У ссылки есть параметр "активна" (поле is_active)

Нужные для запросов поля таблиц:
таблица Subcat
id (идентификатор)
groupid (идентификатор группы, ссылка на него задается неизменным числом для каждого запроса)
name (имя подкатегории)

таблица Links
id (идентификатор)
subgroupid (идентификатор подгруппы)
is_active (показатель активности, может быть 1, 0, по умолчанию 0)

Суть запроса - показать имена подкатегорий и количества активных ссылок в них. Если ссылок в подкатегориях нет, или нет активных ссылок, то показывается 0.

То, что у меня сейчас родилось, теряет те категории, в которых есть только неактивные ссылки. То есть почему так происходит, понятно, но как сформулировать нужный запрос - неясно.

нынешний запрос:
PHP:
SELECT subgroups.id AS id, subgroups.name AS name,
IF ( 
links.id IS NOT NULL , count( * ) , 0
) AS col
FROM subgroups
LEFT JOIN links ON subgroups.id = links.subgroupid
WHERE subgroups.groupid = 1 AND (
links.is_active = 1 OR links.is_active IS NULL
)
GROUP BY subgroups.id, subgroups.name
Заранее спасибо за помощь.
 

tony2001

TeaM PHPClub
SELECT
subgroups.id as id,
subgroups.name AS name,
count(*) as counter
FROM
subgroups
LEFT JOIN ON subgroups.id = links.subgroupid AND links.is_active=1
GROUP BY subgroups.id;

а если так?
 

Screjet

Новичок
По моему эта часть здесь не нужна:
PHP:
AND ( 
links.is_active = 1 OR links.is_active IS NULL 
)
 

tony2001

TeaM PHPClub
>Суть запроса - показать имена подкатегорий и количества
>активных ссылок в них. Если ссылок в подкатегориях нет, или
>нет активных ссылок, то показывается 0.
 

lanka

Новичок
2 tony2001
он немного нерабочий :)
но поправив до рабочего состояния получаем, что не выбираются пустые подкатегории, а также те подкатегории, где есть неактивные ссылки.
Честно говоря двумя запросами это сделать легко. Но неспортивно :)
 

lanka

Новичок
2 скрежет
Нужна. Именно потому, что мне не нужны неактивные ссылки.
Эта часть описывает, что при джойне мне нужны те записи, где ссылка активна, либо те, где ее нет вообще (is null), то есть пустая подкатегория.

Повторюсь, теряется в итоге только та часть подкатегорий, где есть только неактивные ссылки. Та часть подкатегорий, где ссылок нет, либо есть только активные ссылки, либо есть и активные, и неактивные ссылки, показывается корректно.
 

tony2001

TeaM PHPClub
SELECT
subgroups.id as id,
subgroups.name AS name,
count(*) as counter
FROM
subgroups
LEFT JOIN
links
ON subgroups.id = links.subgroupid AND (links.is_active=1 OR links.is_active IS NULL)
GROUP BY subgroups.id;

поэкспериментируй с этим.
 

lanka

Новичок
2 тони2001

Именно то, что нужно, с учетом одной только маленькой замены.

Вот рабочий запрос, если кому интересно
PHP:
SELECT subgroups.id AS id, subgroups.name AS name,
IF (
links.id IS NOT NULL , count( * ) , 0
) AS counter
FROM subgroups
LEFT JOIN links ON subgroups.id = links.subgroupid AND (
links.is_active = 1 OR links.is_active IS NULL
)
GROUP BY subgroups.id
Я так понимаю, моя ошибка была в группировке по двум полям вместо одного? или?
 

tony2001

TeaM PHPClub
по имени не надо было группировать и вынести из WHERE в JOIN условия - они же никогда не выполняться, если записей нет вообще.
 

lanka

Новичок
Автор оригинала: tony2001
по имени не надо было группировать
Это да.

и вынести из WHERE в JOIN условия - они же никогда не выполнятся, если записей нет вообще.
А это нет, тк они выполнялись корректно в том случае, когда записей не было. Не выполнялись в смысле только, если были исключительно неактивные ссылки.
Впрочем может таки гоню, я не большой любитель джойнов, и в них всегда плаваю :)


Тем не менее большое спасибо.
:D
 
Сверху