Нужен совет по sql

Тема в разделе "PHP", создана пользователем асс, 9 май 2009.

Статус темы:
Закрыта.
Модераторы: latteo
  1. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    749
    Симпатии:
    220
    Добрый деню
    Скажите пожалуйста как реализовать базу данных с подкатегориями.

    Например есть категория razdel
    мне надо
    сделать в базе в разделе 2 категории
    пример
    razdel > kategory > podkategory


    раздел категория подкатегория
    Книги> Автомобили> Отечественные

    У меня етсь таблица отдельно в базе данных
    в ней щас есть только раздел.

    Как добавить к нему категорию?
    Создавтаь еще 2 таблицы?

    Если можно объясните пожалуйста.
    Спасибо.
     
  2. tirrex

    tirrex

    Регистр.:
    9 ноя 2008
    Сообщения:
    213
    Симпатии:
    60
    обычно делают так:
    на каждый признак - отдельный словарь
    т.е. три отдельный таблицы: раздел - категория - подкатегория
    в словарях меньшего уровня должно быть поле для связи с вышестоящим словарем по коду например

    таблица разделы
    кодраздела наименование

    таблица категории
    кодраздела кодкатегории наименование

    таблица подкатегории
    кодраздела кодкатегории кодподкатегории наименование

    таким образом легко будут составляться любые выборки
     
  3. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    749
    Симпатии:
    220
    Я так и сделал
    создал 3 таблицы
    cat
    podrazdel
    razdel

    и все их объеденил. Теперь осталось только разобраться как в каждую заносить свое значение.
    Потому как один запрос у меня что то не выходит.

    Придеться наверное делать три запроса, может есть возможность оним запросом загнать?

    Мне кажеться что можно загнать так же как я вбрал их
    из базы

    вот так

    $Q1 = mysql_query("SELECT * FROM cat, razdel,podrazdel WHERE id ");
    далее по названию ячейки выбрать
    или добавить значения
    и все


    echo " категория ".$r['title'];
    echo " раздел ".$r['razd_title'];
    echo " под раздел ".$r['pod_title'];

    хотя наверное не выйдет.
     
  4. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Смысл в разных таблицах?
    А если уровень вложенности 4 или 5 или 10?
    Хранить всё в одной таблице. Вязать через parent id в ней же или через отдельную таблицу связей.
     
  5. tirrex

    tirrex

    Регистр.:
    9 ноя 2008
    Сообщения:
    213
    Симпатии:
    60
    при хранении в нескольких таблицах можно организовать точно такую же схему, и любой уровень вложенности не будет проблемой, считаю, что при этом с данными работать гораздо удобнее

    хранить все в одной таблице вариант как раз гораздо более запутанный, не надо изобретать велосипед

    а поподробнее: что нужно в итоге получить?
     
  6. PHP_Master

    PHP_Master

    Регистр.:
    3 фев 2008
    Сообщения:
    2.647
    Симпатии:
    590
    Читаем про списки смежности, вместо того чтобы умничать.
     
  7. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    749
    Симпатии:
    220
    Я сделал таблицу и добавил туда поля.
    К тому же я думаю что вложение на 10 значений это маловероятно.
    Максимум 4 уровня,
    Я сделал 3 уровня добавил основное поле и два дополнительных, во всяком случае мне так легче.
     
  8. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    311
    tirrex, у каждой записи категории, даже с названием "охренительнодлиннаямлинкатегория", есть свой уникальный идентификатор id и идентификатор родителя, категории на уровень выше(как предложил PHP_Master parent_id), т.е. в данном случае у категории "podkategory" parent_id будет равен id "kategory", у "kategory" parent_id=id "razdel", а у "razdel" parent_id равен 0 либо NULL. Таким способом можно реализовать бесконечное вложенное количество подкатегорий и все это размещается в одной таблице. Так устроены разделы, подразделы и темы в большинстве(если не во всех) форумах, в т.ч. vBulletin, который расположен на nulled.ws
     
  9. асс

    асс

    Регистр.:
    13 окт 2006
    Сообщения:
    749
    Симпатии:
    220

    Если не сложно продемонстрируйте примерчик, как сделать все в одной таблице.Хотябы на 2 уровня вложения.


    Вот у меня
    таблицы

    Основная категория
    CREATE TABLE `cat` (
    `id` int(9) NOT NULL auto_increment,
    `cpu` varchar(125) NOT NULL,
    `title` varchar(125) NOT NULL,
    `razd_id` int(9) default NULL,
    UNIQUE KEY `title` (`title`),
    KEY `id` (`id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=2 ;
    INSERT INTO `cat` VALUES (1, 'knigi', 'Книги', 1);


    В категории Автомобили книги есть много подкатегорий
    CREATE TABLE `razdel` (
    `razd_id` int(9) NOT NULL auto_increment,
    `razd_cpu` varchar(25) NOT NULL,
    `razd_title` varchar(25) NOT NULL,
    `pod_id` int(9) NOT NULL,
    KEY `razd_id` (`razd_id`)
    ) ENGINE=MyISAM AUTO_INCREMENT=30 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=30 ;
    INSERT INTO `razdel` VALUES (1, 'avtomobili', 'Автомобили', 1);
    INSERT INTO `razdel` VALUES (2, 'bestsellery', 'Бестселлеры', 1);
    INSERT INTO `razdel` VALUES (3, 'delovaya_literatura', 'Деловая литература', 1);

    Ну еще можно добавить подразел это уже 3 уровень
    CREATE TABLE `podrazdel` (
    `pod_id` int(9) NOT NULL auto_increment,
    `pod_cpu` varchar(25) NOT NULL,
    `pod_title` varchar(25) NOT NULL,
    KEY `pod_id` (`pod_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;
     
  10. PapaJoe

    PapaJoe

    Регистр.:
    4 авг 2008
    Сообщения:
    620
    Симпатии:
    311
    что-то вроде:
    PHP:
    CREATE TABLE `cat` (
    `
    idINT NULL AUTO_INCREMENT PRIMARY KEY ,
    `
    parent_idINT NOT NULL ,
    `
    cpuVARCHAR125 NOT NULL ,
    `
    titleVARCHAR125 NOT NULL 
    TYPE MYISAM CHARACTER SET cp1251 COLLATE cp1251_general_ci;
    данные:
    PHP:
    -- 1-ый уровень
    INSERT INTO 
    `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
    VALUES (
    NULL '0''knigi''Книги'
    );
    -- 
    1-ый уровень закончился
    -- 2-ой уровень
    INSERT INTO 
    `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
    VALUES (
    NULL '1''avtomobili''Автомобили'
    );

    INSERT INTO `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
    VALUES (
    NULL '1''bestsellery''Бестселлеры'
    );

    INSERT INTO `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
    VALUES (
    NULL '1''delovaya_literatura''Деловая литература'
    );
    -- 
    2-ой уровень закончился
    -- 3-ий уровень
    INSERT INTO 
    `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
    VALUES (
    NULL '2''vaz''Ваз'
    );

    INSERT INTO `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
    VALUES (
    NULL '2''uaz''Уаз'
    );

    INSERT INTO `cat` ( `id` , `parent_id` , `cpu` , `title` ) 
    VALUES (
    NULL '2''gaz''Газ'
    );
    -- 
    3-ий уровень закончился
     
Статус темы:
Закрыта.