文档章节

mysql位运算的应用

webphp
 webphp
发布于 2017/07/26 11:28
字数 697
阅读 19
收藏 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
海淀
程序员
私信 提问
加载中

评论(0)

四:MySQL中的运算符 - 系统的撸一遍MySQL

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

logbird
2016/08/17
163
0
(九)MySQL数据库-MySQL 运算符

版权声明:转载请注明原文地址 https://blog.csdn.net/Super_RD/article/details/89789123 (九)MySQL数据库-MySQL 运算符 我的系统版本为CentOS7.5,MySQL版本为5.7.26 算术运算符 在除法运...

Super_RD
2019/05/03
0
0
MySQL 运算符:算术运算符、比较运算符、逻辑运算符、位运算符剖析

MySQL 运算符 本章节我们主要介绍 MySQL 的运算符及运算符的优先级。 MySQL 主要有以下几种运算符: 算术运算符 比较运算符 逻辑运算符 位运算符 算术运算符 MySQL 支持的算术运算符包括: 运...

osc_4kx715qw
03/05
6
0
mysql 基本命令(3)-数据类型和运算符

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

tianfo
2018/06/26
0
0
mysql 实现类似oracle函数bitand功能

oracle中位运算函数bitand中在mysql的实现是 &运算符,我司使用的JPA要在oracle和mysql中自由切换,所以使用统一的位运算操作方法 mysql实现bitand函数的功能,我们有两种解决方案: 1. 在m...

osc_vyztkm1b
2019/12/27
1
0

没有更多内容

加载失败,请刷新页面

加载更多

.NET中小数,浮点数和双精度之间的区别? - Difference between decimal, float and double in .NET?

问题: What is the difference between decimal , float and double in .NET? .NET中的decimal , float和double float什么区别? When would someone use one of these? 有人什么时候会使用......

fyin1314
57分钟前
22
0
如何找出Windows上正在侦听端口的进程? - How can you find out which process is listening on a port on Windows?

问题: 如何找出Windows上正在侦听端口的进程? 解决方案: 参考一: https://stackoom.com/question/CXO/如何找出Windows上正在侦听端口的进程 参考二: https://oldbug.net/q/CXO/How-can...

技术盛宴
今天
10
0
OSChina 周三乱弹 —— 一家动物都快饿成标本了~

@黑觉非常君 :前天晚上9点开始睡觉,睡到昨天上午8点起床,昨天下午2点又睡,睡到下午7点多,晚上10点又困了,又睡,睡到今天上午8点,中途没醒过,怎么这么能睡,是不是快挂了。 能睡不是好...

小小编辑
今天
15
0
神剧推荐全剧最污片段精剪

神剧推荐,全剧最污片段精剪 豆瓣评分最高,脑洞最大,脑回路最曲折,恶搞无数经典,没有一条差评的神剧 整个系列完整版 到这里观看

a57571735
今天
22
0
pingan.

职位诱惑:金融,技术研发,技术攻关,大舞台大作为职位描述:职位诱惑:立志打造一支国内一流实盘量化交易框架开发团队职位描述:职位描述:负责实盘低时延量化交易框架及附属行...

MtrS
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部