Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/226.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 类别和子类别的数据库结构_Php_Sql Server_Recursion - Fatal编程技术网

Php 类别和子类别的数据库结构

Php 类别和子类别的数据库结构,php,sql-server,recursion,Php,Sql Server,Recursion,我有点困惑,什么是类别数据库结构的最佳解决方案。这里,我有下面的分类列表 新闻 1.1一般新闻 1.2娱乐新闻 1.3体育新闻 占星术 2.1.1 Aries 2.1.2 Taurus 2.1.3 Gemini ..... 2.1.12 Pisces 2.2.1 Aries 2.2.2 Taurus 2.2.3 Gemini ..... 2.2.12 Pisces 2.1每日星座 2.1.1 Aries 2.1.2 Tau

我有点困惑,什么是类别数据库结构的最佳解决方案。这里,我有下面的分类列表

  • 新闻

    1.1一般新闻

    1.2娱乐新闻

    1.3体育新闻

  • 占星术

      2.1.1 Aries
    
      2.1.2 Taurus
    
      2.1.3 Gemini
    
       .....
    
      2.1.12 Pisces
    
      2.2.1 Aries
    
      2.2.2 Taurus
    
      2.2.3 Gemini
    
       .....
    
      2.2.12 Pisces
    
    2.1每日星座

      2.1.1 Aries
    
      2.1.2 Taurus
    
      2.1.3 Gemini
    
       .....
    
      2.1.12 Pisces
    
      2.2.1 Aries
    
      2.2.2 Taurus
    
      2.2.3 Gemini
    
       .....
    
      2.2.12 Pisces
    
    2.2每周星象

      2.1.1 Aries
    
      2.1.2 Taurus
    
      2.1.3 Gemini
    
       .....
    
      2.1.12 Pisces
    
      2.2.1 Aries
    
      2.2.2 Taurus
    
      2.2.3 Gemini
    
       .....
    
      2.2.12 Pisces
    
  • 笑话

  • 这是我目前的分类清单。在这里,我必须建立管理面板的类别和子类别可以添加。目前,我有2个星座子类别。在未来,更多的子类别可以添加,如每月和每年的星座只是一个例子。另一个困惑是,每日和每周星座都有相同的子类别,这意味着单个子类别有多个父类别。在这里,如何消除数据库表中的重复。我需要使用递归函数以树状结构显示类别。
    我在谷歌上搜索解决方案,但找不到合适的答案。请你提供我的答案或相关链接。我正在用php和MS server数据库进行编码。

    试试这样的方法怎么样,创建一个类别表,其中包含以下字段:id、父id和标题, 然后,每个类别都有一个父类id或顶级类别的0

    如果您愿意,您可以将标题设置为包含id和标题的不同表,然后您可以在类别表中引用标题表中相应的标题

    想想看,它将遵循这一规则集,这正是您所寻找的:

    • 每个类别都与零个或多个类别关联
    • 每个类别都与一个标题关联
    • 每个标题都与一个或多个类别关联
    至于递归地表示它,这种方式相当简单。
    希望这能帮到你。

    这是一篇关于sql 2005中使用公共表表达式的递归查询的文章


    我建议你注册他们的时事通讯,几乎每天都有新的东西,可能会派上用场。

    你的数据库结构应该包含他们的父级相关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');
    

    这是我几年前写的一些难看的代码。。。但它可能会帮助你的操作

    DB table“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>';
        }
      }
    }
    
    我建议您将其改写为您的对象,以便更好地使用

    对不起,我的英语不好

    这对我很有用:

    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
    

    在我看来,最好的解决方案是有一个字段
    parent\u id
    ,它引用同一个表您使用的是什么sql server版本?可能重复(我的答案中有一个通用的解决方案)请提供递归函数示例,以循环遍历所有类别和子类别列表。我认为可以有多个具有相同索引的数组。在这里,数组可能有多个相同的索引,因为父列没有唯一的值,例如在while循环中,它可能有$childs[1][1]两次替换以前的值。但ID列是唯一的,所以它不会替换以前的值,只需向数组中添加另一个值即可。这个解决方案使用多维数组。哦。。是我的错,我显然没有得到你的回答。很抱歉