仿位操作分类算法

此算法折衷于位运算操作算法的执行效率和算法复杂度

高效分类算法见:http://blog.csdn.net/sea0x/archive/2008/01/07/2028196.aspx


参照位操作原理,以固定位数做为某层级分类区域组成分类编码,以体现分类的顺序,层级,父子关系情况。


如下使用四位为一层级的实例来分析其应用:

表一:
CREATE TABLE [tbl_GiftProductClass] (
 [GiftProductClassID] [int] IDENTITY (1, 1) NOT NULL ,
 [GiftProductClassName] [nvarchar] (30) COLLATE Chinese_PRC_CI_AS NULL ,
 [GiftProductClassCode] [varchar] (20) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO

GiftProductClassID  GiftProductClassName    GiftProductClassCode
------------------ --------------------------- --------------------
11                 数码电子                     0001
28                 钟表                  00010001
188                时钟                         000100010001
189                手表                        000100010002

以上数据我们很容易看出

“时钟”和“手表” 是属于“钟表”的子类,而“钟表”又是“数码电子”的子类

基于分类的各种应用操用SQL如下:

取得子类,含孙子节点
SELECT * FROM [tbl_GiftProductClass] WHERE GiftProductClassCode LIKE '0001%' ORDER BY GiftProductClassCode ASC

仅取得子类,不含孙子节点
SELECT * FROM [tbl_GiftProductClass] WHERE GiftProductClassCode LIKE '0001____' ORDER BY GiftProductClassCode ASC

仅取得孙子节点 不含子类节点
SELECT * FROM [tbl_GiftProductClass] WHERE GiftProductClassCode LIKE '0001________' ORDER BY GiftProductClassCode ASC

可归纳为取得相对某分类某层(level)所有节点
WHERE GiftProductClassCode LIKE '0001" + new string('_',level*4) + "'

取得某类所有长辈类
SELECT * FROM [tbl_GiftProductClass]  WHERE (GiftProductClassCode = LEFT('000100010002', LEN(GiftProductClassCode))) ORDER BY GiftProductClassCode

 

修改一个分类:


添加分类时取得下一个分类代码的方法(C#):


上移下移某个分类方法(C#):

对于产品应用呢,再来建实例表。

表二:
CREATE TABLE [tbl_GiftProduct] (
 [GiftProductID] [int] IDENTITY (1, 1) NOT NULL ,
 [GiftProductName] [nvarchar] (100) COLLATE Chinese_PRC_CI_AS NOT NULL ,
 [GiftProductClassID] [int] NULL
) ON [PRIMARY]
GO


GiftProductID   GiftProductName      GiftProductClassID
------------------ --------------------- --------------------
213                指南针石英钟               188
321                罗西尼手表                  189

 

另建立一个视图方便后面使用:

CREATE VIEW dbo.vi_GiftProdcut
AS
SELECT dbo.tbl_GiftProduct.*, dbo.tbl_GiftProductClass.GiftProductClassName,
      dbo.tbl_GiftProductClass.GiftProductClassCode
FROM dbo.tbl_GiftProductClass INNER JOIN
      dbo.tbl_GiftProduct ON
      dbo.tbl_GiftProductClass.GiftProductClassID = dbo.tbl_GiftProduct.GiftProductClassID
GO


现在我们要查询出产品就比较方便了

查所有“数码电子”产品
SELECT * FROM [vi_GiftProdcut] WHERE GiftProductClassCode LIKE '0001%'

查所有“钟表”产品
SELECT * FROM [vi_GiftProdcut] WHERE GiftProductClassCode LIKE '00010001%'

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值