Проблема с организацией структуры БД

Svarga

Guest
Проблема с организацией структуры БД

Вечер добрый.

Пишу каталог(топ) сайтов, со структурой похожей на яндекс каталог, после наброска БД возникла проблема с выводом на печать всех категорий.

Структуру вижу так:

Category_id | Category
001 | PHP
002 | MySQL
003 | Perl
001001 | PHP and MySQL
001002 | PHP and MsSQL

001001 и 001002 это дочки категории PHP

Дочек и родителей намечается около 100.

Получается чтобы вывести родителя и дочку требуется 2 запроса.

Может я не до конца понял матчасть в плане SQl запросов, если так то помогите плиз этим самым запросиком...
 

Demiurg

Guest
какты определяешь, что одна запись дочка другой ?
 

Svarga

Guest
Ищю все записи длиной в шесть знаков, первые три знака которых равны 001...
 

Кром

Новичок
>Ищю все записи длиной в шесть знаков, первые три знака которых равны 001...

А почему не сделать стандартно:
ID, PID, CATEGORY, где PID - идентификатор родителя
 

Demiurg

Guest
а что при этом заначат остальные три знака ?
 

Svarga

Guest
Demiurg Остальные три это id дочки

Кром Т.е. если пойти таким путем то нужно 2 таблицы, одна с родителями, другая с дочками. Тогда все равно нужно будет два запроса, один на родителя, другой на дочек. Поправьте если не прав.
 

Demiurg

Guest
>Остальные три это id дочки
то есть у дочки не может быть дочки ?
 

Svarga

Guest
nekoВсмысле? как я тогда определю что дочка относится конкретно к этому родителю, если у всех родителей стоят NULL.
 

neko

tеam neko
Svarga

перечитай пост Кром'a
у объектов есть id.
для дочерних объектов, в PID пишешь id родителя
для "родителей" пишешь NULL
 

Demiurg

Guest
Svarga
тогда почему не сделать 2 таблицы ?
в одной будет ссылка на вторую.
 

Svarga

Guest
Всем спасибо большое за помощь... То что нужно.

-~{}~ 18.06.04 12:28:

Извините за подъем топика, вот накатал функцию, хотелось бы узнать ваше мнение о ней:

CREATE TABLE `table1` (
`id` tinyint(4) unsigned NOT NULL auto_increment,
`pid` tinyint(4) NOT NULL default '0',
`title` varchar(100) default NULL,
PRIMARY KEY (`id`)
) TYPE=MyISAM



INSERT INTO `table1` (`id`, `pid`, `title`) VALUES
(1,0,'Бизнес и экономика'),
(2,0,'Развлечения'),
(3,0,'Образование'),
(4,1,'Экономика'),
(5,1,'Бухгалтерия'),
(6,1,'Аудит'),
(7,1,'Деньги'),
(8,2,'MP3'),
(9,2,'Музыка'),
(10,3,'Рефераты');

Собственно сама функция:


//выбираем полностью всю таблицу
$sqlstr = mysql_query("SELECT id, pid, title FROM treetable") or die('error');

//Загоняем таблицу в массив
while (list($id, $pid, $title) = mysql_fetch_row($sqlstr))
{
$treedb[$pid][$id] = $title;
}

function printTree($pid = 0, $roottitle = NULL)
{
global $treedb;
global $site;
//Уровень
static $level = 1;

if(is_array($treedb[$pid]))
{
foreach($treedb[$pid] as $id=>$title)
{
if ($pid == 0)
{
echo '<li><a href="'.$site.$title.'/">'.$title.' - '.$level.' / '.$pid.'</a></li>';
$roottitle = $title;
}

if ($pid >= 1)
{
echo '<li><a href="'.$site.$roottitle.'/'.$title.'/">'.$title.' - '.$level.' / '.$pid.'</a></li>';
}

//Выводим ветки дерева
if (isset($treedb[$id]))
{
echo '<ul>';
$level++;
printTree($id, $roottitle);
//$level--;
echo '</ul>';
}
}
}
}
 

AdminGorkyRu

Новичок
а что если у тебя в процессе работы появитсяеще одна категория нулевого уровня, которую тебе нужно будет выводит Например после раздела "Развлечения"? ... предлагаю добавить еще одно поле в таблицу:
'sort' INT(2) NOT NULL default 0

и запрос выбора переписать как:
SELECT id,pid,title FROM treetable ORDER by sort DESC(ASC) - зависит от того как ты будешь менять поле sort ...
 
Сверху