我有点困惑什么可以是类别数据库结构的最佳解决方案。在这里,我有以下的cateogry列表。
新闻
1.1一般新闻
1.2娱乐新闻
1.3体育新闻
学
2.1每日星座运势
2.1.1 Aries
2.1.2 Taurus
2.1.3 Gemini
.....
2.1.12 Pisces
2.2每周星座运势
2.2.1 Aries
2.2.2 Taurus
2.2.3 Gemini
.....
2.2.12 Pisces
笑话
这是我目前的类别列表。在这里,我必须构建管理面板,其中可以添加类别和子类别。目前,我有2个星座类星座。在未来,可以添加更多子类别,例如月度和年度星座运势。另一个困惑是每日和每周占星具有相同的子类别,这意味着单个子类别具有多个父类别。在这里,我如何消除数据库表中的重复。我需要使用递归函数在树结构中显示类别。 我谷歌的解决方案,我找不到合适的答案。你能不能给我答案或者与之相关的链接。我在php和MS-server数据库中编码。
答案 0 :(得分:1)
如何尝试这样的东西,有一个类别表,其中包含以下字段,id,parent_id和title, 然后,每个类别都有一个parent_id或0表示顶级类别。
如果您愿意,您可以将标题设为包含ID和标题的不同表格,然后您可以在类别表格中引用标题表格上的相应标题。
想一想,它将遵循这个规则集,这正是您正在寻找的:
至于递归表示它,这种方式相当容易。 希望能为你做到这一点。
答案 1 :(得分:1)
这是一篇关于使用公用表表达式在sql 2005中进行递归查询的文章。
http://www.sqlservercentral.com/articles/T-SQL/recursivequeriesinsql1999andsqlserver2005/1846/
我建议你注册他们的时事通讯,几乎每天都有新的东西可以派上用场。
答案 2 :(得分:1)
这里是我几年前写的一些丑陋的代码......但它可以帮助你作为操作方法
数据库表“table_name”结构
ID PARENT NAME
1 0 1
2 0 2
3 1 1.1
4 1 1.2
5 4 1.2.1
6 4 1.2.2
7 2 2.1
获取和准备数据
$Select = mysql_query("SELECT * FROM table_name");
while($Row = mysql_fetch_assoc($Select)){
if($Row['parent'] == 0){
$Arr[$Row['id']] = $Row['name'];
}else{
$Childs[$Row['parent']][$Row['id']] = $Row['name'];
}
}
一些愚蠢但充足的功能
function gettree($Array){
global $Childs;
foreach($Array as $key => $value){
echo '<li>'.$value.'</li>';
if(isset($Childs[$key])){
echo '<li><ul>';
gettree($Childs[$key]);
echo '</ul></li>';
}
}
}
并将树建成
echo '<ul>';
gettree($Arr);
echo '</ul>';
结果应该像这样
1
1.1
1.2
1.2.1
1.2.2
2
2.1
我建议您将其重写为对象以便更好地使用
抱歉我的英文
答案 3 :(得分:0)
您的数据库结构应包含其父相关ID,并在管理面板中获取selectbox中的父类别和子父类别
USE `database`;
CREATE TABLE `category` (
`c_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`category_name` varchar(255) DEFAULT NULL,
`status` enum('active','inactive') DEFAULT 'active',
PRIMARY KEY (`c_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
/*Data for the table `category` */
insert into `category`(`c_id`,`category_name`,`status`) values (1,'For Sale','active'),(2,'Community','active'),(3,'Classes','active'),(4,'Vehicles','active'),(5,'Real Estate','active'),(6,'Services','active'),(7,'Matrimonial','active'),(8,'Jobs','active');
CREATE TABLE `sub_category` (
`sub_cat_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`c_id` int(11) DEFAULT NULL,
`sub_category_name` varchar(255) DEFAULT NULL,
`status` enum('active','inactive') DEFAULT 'active',
PRIMARY KEY (`sub_cat_id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;
/*Data for the table `sub_category` */
insert into `sub_category`(`sub_cat_id`,`c_id`,`sub_category_name`,`status`) values (1,1,'Animals','active'),(2,1,'Art - Collectibles','active'),(3,1,'Books - Magazines','active'),(4,1,'Business - Industrial','active'),(5,4,'Cars','active'),(6,4,'Truck','active');
/*Table structure for table `sub_category_child` */
CREATE TABLE `sub_category_child` (
`sub_category_child_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`c_id` int(11) DEFAULT NULL,
`sub_cat_id` int(11) DEFAULT NULL,
`sub_category_child_label` varchar(255) DEFAULT NULL,
`nature` varchar(20) DEFAULT NULL,
`status` enum('active','inactive') DEFAULT 'active',
PRIMARY KEY (`type_id`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=latin1;
insert into `sub_category_child`(`sub_category_child_id`,`c_id`,`sub_cat_id`,`sub_category_child_label`,`nature`,`status`) values (1,4,5,'Make','parent','active'),(2,4,5,'Model','child','active'),(3,4,5,'doors','independent','active'),(4,4,5,'accessories','independent','active'),(5,1,1,'abc','parent','active'),(6,4,6,'No of Tyre','parent','active'),(8,4,6,'loader','independent','active');
答案 4 :(得分:0)
这对我有用:
CREATE TABLE [dbo].[Category](
[id] [int] IDENTITY(1,1) NOT NULL,
[Cat_Id] [int] NOT NULL,
[Cat_Nm] [varchar](50) NOT NULL,
[Parent_Id] [int] NULL,
CONSTRAINT [PK_Category] PRIMARY KEY CLUSTERED
(
[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: Index [IX_Category] Script Date: 04/25/2012 07:30:14 ******/
CREATE UNIQUE NONCLUSTERED INDEX [IX_Category] ON [dbo].[Category]
(
[Cat_Id] ASC,
[Cat_Nm] ASC,
[Parent_Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Category] WITH CHECK ADD CONSTRAINT [FK_Category_Category] FOREIGN KEY([Parent_Id])
REFERENCES [dbo].[Category] ([id])
GO
ALTER TABLE [dbo].[Category] CHECK CONSTRAINT [FK_Category_Category]
GO
SET IDENTITY_INSERT [dbo].[Category] ON;
INSERT INTO [dbo].[Category]([id], [Cat_Id], [Cat_Nm], [Parent_Id])
SELECT 9, 1, N'Aries', 7 UNION ALL
SELECT 12, 1, N'Aries', 8 UNION ALL
SELECT 7, 1, N'Daily', 2 UNION ALL
SELECT 4, 1, N'General News', 1 UNION ALL
SELECT 1, 1, N'News', NULL UNION ALL
SELECT 5, 2, N'Enterntainment News', 1 UNION ALL
SELECT 2, 2, N'Horoscope', NULL UNION ALL
SELECT 10, 2, N'Taurus', 7 UNION ALL
SELECT 13, 2, N'Taurus', 8 UNION ALL
SELECT 8, 2, N'Weekly', 2 UNION ALL
SELECT 11, 3, N'Gemini', 7 UNION ALL
SELECT 14, 3, N'Gemini', 8 UNION ALL
SELECT 3, 3, N'Jokes', NULL UNION ALL
SELECT 6, 3, N'Sports News', 1
SET IDENTITY_INSERT [dbo].[Category] OFF;
GO
CREATE VIEW Categories
AS
WITH cte ( id, Cat_Id, [Name], [Level] )
AS ( SELECT id ,
Cat_Id ,
Cat_Nm ,
CAST(Cat_Id AS VARCHAR(5))
FROM dbo.Category c
WHERE Parent_Id IS NULL
UNION ALL
SELECT c.id ,
c.Cat_Id ,
c.Cat_Nm ,
CAST(ct.[Level] + '.'
+ CAST(c.Cat_Id AS VARCHAR(5)) AS VARCHAR(5))
FROM dbo.Category c
JOIN cte ct ON c.Parent_Id = ct.id
WHERE c.Parent_Id IS NOT NULL
)
SELECT Level ,
Name
FROM cte