Вопрос № 70944: Здраствуйте уважаемые эксперты!
Вот такой вопрос:
В базе есть таблица cats такого типа:
id (auto_inscrement) title parent
В не содержаться названия категорий и их подкатегории причём категории имеют parent=0, а подкатегории ...
Вопрос № 70.944
Здраствуйте уважаемые эксперты!
Вот такой вопрос:
В базе есть таблица 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. ).
Отвечает: dianacode
доброе время суток, 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 ^_^
с уважением, удачи
--------- There is more than one way to do it.
Ответ отправила: dianacode (статус: Студент)
Ответ отправлен: 14.01.2007, 23:39 Оценка за ответ: 5 Комментарий оценки: Да я бы рад! Но структуру делал не я! Хотя я всё таки попробую модернизировать базу. СПАСИБО!
Отвечает: Tek
Здравствуйте, 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'а - проверить на ситаксис не получиться
--------- WinApi - жутко неудобные костыли, MFC и VCL - немногим полезнее, но ничего лучше еще не создано (C)Почти Уинстон Черчилль :)
Ответ отправил: Tek (статус: 7-ой класс)
Ответ отправлен: 15.01.2007, 10:28 Оценка за ответ: 5 Комментарий оценки: Попробую... Большое спасибо!