文档章节

mysql位运算的应用

webphp
 webphp
发布于 2017/07/26 11:28
字数 697
阅读 4
收藏 0

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,则可以用
update lcm_article set flag= flag| 4 where id= 1
例2:在加上4之后我们想去掉4怎么办呢,可以这样实现
update lcm_article set flag= flag^ 4 where id= 1
这样就又把4从该记录中去掉了. 如果我们想选择所有为2的记录该怎么做呢,可以这样实现
select * from lcm_article where flag & 2 = 2
如果想获取有置顶(1)、推荐(4)的文章,可以这样实现
Select * from lcm_article where flay & 5
这样就可以同时获取到置顶和推荐的文章了,5是置顶的1+推荐的4的和 也可以进行排序
select * from lcm_article order by flag & 1 desc
这样我们就把所有置顶的贴子排在前面,当然这里可以加上一定的Where 条件,在Where 里也可可以加一定的位运算 如果我们知道一篇文章如何得到文章有多少种状态 例如文章中的flag的值为5,(同时有置顶和推荐的状态),那么我们相通过这篇文章得到有几种状态的时候,可以写如下sql
Select * from lcm_flag where 5 & square = square;
其中的5为lcm_article表中flag的值,这个值的产生是状态表中square值的相加(1+4)为置顶和推荐两种状态就可以到lcm_flay表中的置顶和推荐的两条数据

© 著作权归作者所有

共有 人打赏支持
webphp
粉丝 1
博文 92
码字总数 92338
作品 0
海淀
程序员
私信 提问
四:MySQL中的运算符 - 系统的撸一遍MySQL

MySQL支持许多整理的运算符,其中主要包括以下几类:算数运算符、比较运算符、逻辑运算符、位运算符。 算数运算符 运算符 作用 + 加法 - 减法 * 乘法 / 或 DIV 除法 % 或 MOD 取余 示例: 运...

logbird
2016/08/17
35
0
mysql 基本命令(3)-数据类型和运算符

一、数值类型 1、数据类型有:数值类型、日i期类型、字符串类型。 2、int(20),int 指整数的取值范围,里面的参数20,只是表示数据显示的宽度。显示宽度和数据类型的取值范围是无关的。显示...

tianfo
06/26
0
0
四、MySQL的数据类型和运算符

4.1、MySQL数据类型介绍 MySQL支持多种数据类型,主要有数值类型、日期/时间类型和字符串类型。 整数类 MySQL中的整数型数据类型 不同整数类型的取值范围 mysql> CREATE TABLE tmp1(x TINYI...

梦想成大牛
06/28
0
0
C语言位运算符及常见用法

C语言位运算符及常见用法 Mindy2017-03-1232 阅读 用法运算符C语言 一、位运算符C语言提供了六种位运算符: & 按位与 | 按位或 ^ 按位异或 ~ 取反 << 左移 >> 右移 按位与运算 按位与运算符...

Mindy
2017/03/12
0
0
编程中位运算应用

位运算是计算机底层进行高级运算的基本操作,理解位运算含义,以及位运算的基本用法,是检验一个技术人员是否掌握基础关键, 今天就简单讲解一下基本位运算用法。 1.& 位与运算 1) 运算规则:...

abaojin
2016/01/05
49
0

没有更多内容

加载失败,请刷新页面

加载更多

[LintCode] Binary Tree Level Order Traversal(二叉树的层次遍历)

描述 给出一棵二叉树,返回其节点值的层次遍历(逐层从左往右访问) 样例 给一棵二叉树 {3,9,20,#,#,15,7} : 3 / \9 20 / \ 15 7 返回他的分层遍历结果: [ [3], [...

honeymose
13分钟前
1
0
Spring Cloud Config 规范

Spring Cloud Config 规范 首先Spring Cloud 是基于 Spring 来扩展的,Spring 本身就提供当创建一个Bean时可从Environment 中将一些属性值通过@Value的形式注入到业务代码中的能力。那Sprin...

阿里云官方博客
22分钟前
1
0
renderer

renderer Function 单元格绘制处理函数,同drawcell事件。

architect刘源源
33分钟前
5
0
jdk1.8 lambda表达式过滤重复的对象

//操作类public class BizAgentAudit {    private String supplierOrgId;    private int age;    private String name;        public BizAgentAudit() { ...

INSISTQIAO
34分钟前
6
0
DataUtil的日期处理

SimpleDateFormat 是线程不安全的类,一般不要定义为 static 变量,如果定义为static,必须加锁,或者使用 DateUtils 工具类。 解决方法 1、将SimpleDateFormat定义成局部变量。 缺点:每调用...

DoLo-lty
38分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部