mysql位运算的应用

来源:互联网 时间:2017-07-27


mysql位运算的应用 在最近的项目开发遇到了用户角色和权限的问题,也就是mysql中,某条数据与其它数据存在一对多的关系,一般我们很自然的就会想到建立一个关系表。 其实这种方法是可以。就是查询的时候关联太多,效率低。 现在用mysql的位运算来处理这样的机制, 数据库采用1,2,4,8,16.....等用数字标识的状态字段可以进行累加,对存在的几种状态进行组合,从而可形成各种组合状态 今天举的例子就不用户角色和权限来实例,用文章中的中四种状态来举例,比如在发布文章的时候用以下几种状态, 状态表:
CREATE TABLE `lcm_flag` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(120) NOT NULL DEFAULT '' COMMENT '状态名称',
`square` mediumint(6) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 数据为: 1:置顶1 2:不置顶2 3:推荐4 4:不推荐8 其次是一张文章表
CREATE TABLE `lcm_article` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(120) NOT NULL DEFAULT '' COMMENT '文章名称',
`flag` mediumint(6) NOT NULL, DEFAULT '' COMMENT '标记状态',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; 再次说一下sql的位运算 例如:一条记录该字段原来的数字是,2,如我们想加上4,则可以用
updatelcm_article setflag=flag|4whereid=1 例2:在加上4之后我们想去掉4怎么办呢,可以这样实现
updatelcm_articlesetflag=flag^4whereid=1 这样就又把4从该记录中去掉了. 如果我们想选择所有为2的记录该怎么做呢,可以这样实现
select*fromlcm_articlewhereflag&2=2 如果想获取有置顶(1)、推荐(4)的文章,可以这样实现
Select*fromlcm_articlewhereflay&5 这样就可以同时获取到置顶和推荐的文章了,5是置顶的1+推荐的4的和 也可以进行排序
select*fromlcm_articleorderbyflag&1desc 这样我们就把所有置顶的贴子排在前面,当然这里可以加上一定的Where条件,在Where里也可可以加一定的位运算 如果我们知道一篇文章如何得到文章有多少种状态 例如文章中的flag的值为5,(同时有置顶和推荐的状态),那么我们相通过这篇文章得到有几种状态的时候,可以写如下sql
Select*fromlcm_flagwhere5&square=square; 其中的5为lcm_article表中flag的值,这个值的产生是状态表中square值的相加(1+4)为置顶和推荐两种状态就可以到lcm_flay表中的置顶和推荐的两条数据

相关阅读:
Top