Консультация № 70944
14.01.2007, 21:47
0.00 руб.
0 3 2
Здраствуйте уважаемые эксперты!

Вот такой вопрос:
В базе есть таблица cats такого типа:
id (auto_inscrement) title parent

В не содержаться названия категорий и их подкатегории причём категории имеют parent=0, а подкатегории parent="id основной категории".

Ести ещё одна таблица test:
id(a_i) title cats

В поле cats содержаться id номера подкатегорий в таком виде +id1++id2++id3+...

Т.е. для получения количества записей из второй таблицы, ссылающихся на какую либо подкатегоорию из первой я делал такоз запрос:

1) SELECT count(id) FROM test WHERE cats LIKE "%+‘.$id.‘+%", где $id-номер подкатегории из первой :)
Итак собственно вопрос!

Моя задача получить кол-во (а потом и извлечь) ОСНОВНЫХ категорий у которых хотя-бы на одну подкатегорию ссылается хоть-бы одна запись из второй таблицы ( см 1. ).

Как сделать такое условие отбора?

Обсуждение

Неизвестный
14.01.2007, 23:39
общий
это ответ
доброе время суток, Golden Spider

ужас как сложно... ) а мануалы по проектированию в реляционных субд вам не попадались ? ;)

или это особенность программного кода, который работает с этой структурой ?

так или иначе - попробуйте вариант с перепроектированием модели, ну, к примеру, добавьте дополнительную вспомогательную таблицу, вообщем решение походит на вот это:

create table cats(
id int unsigned not null auto_increment,
parent int unsigned not null default 0,
title varchar(50)
);

create table test(
id int unsigned not null auto_increment,
title varchar(50)
);

create table cats_test(
cats_test_id int unsigned not null auto_increment,
test_id int not null,
cats_id int not null
);

далее, если нам нужно добавить ассоциацию группы котов )) к какой-либо записи из test, делаем так:
insert into cats_test_id values(0, 1, 1);
потом ещё кот
insert into cats_test_id values(0, 1, 2);
а потом ещё стадо котов )))
insert into cats_test_id values(0, 1, 3);
insert into cats_test_id values(0, 1, 4);
insert into cats_test_id values(0, 1, 5);

и так сколько угодно котов можно ассоциировать с записью в таблице test

ну и селект по такой таблице делать - одно удовольствие -
select count(*) from cats_test where test_id=258;

так вы посчитаете количество котов, которые должны быть ассоциированы с первой записью таблицы test ^_^

с уважением, удачи
Неизвестный
15.01.2007, 10:28
общий
это ответ
Здравствуйте, Golden Spider!
Уважаемая dianacode несомненно права: создавать такие структуры это извините попахивает особо тяжкими извращениями.
Но все-таки составить такой запрос можно, хоть это и страшно:
Select ct.* from cats ct, tests tst, (select count() as cnt from tests t, cats с where t.cats LIKE "%+‘.$c.id.‘+%" and c.id in (select id from cats c1 where c1.parent=ct.id)) incl where ct.parent=0 and incl.cnt>0
Под рукой нет никакого sql executor‘а - проверить на ситаксис не получиться
Неизвестный
16.01.2007, 11:46
общий
^_^ ошибка подкралась незаметноinsert into cats_test_id values(0, 1, 5);и им подобным следует читать как:insert into cats_test values(0, 1, 5);
Форма ответа