文档章节

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
码字总数 92070
作品 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
编程中位运算应用

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

abaojin
2016/01/05
49
0
Mysql 数据类型优化(三)

一、日期与时间类型 MySQL 可以使用许多类型来保存日期和时间值。 如:YEAR和DATE。MySQL能存储的最小时间粒度为秒(MariaDB支持微秒级别的时间类型)。但是MySQL也可以使用微妙级的粒度进行...

@ccny
2015/10/24
113
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

[雪峰磁针石博客]软件测试专家工具包1web测试

web测试 本章主要涉及功能测试、自动化测试(参考: 软件自动化测试初学者忠告) 、接口测试(参考:10分钟学会API测试)、跨浏览器测试、可访问性测试和可用性测试的测试工具列表。 安全测试工具...

python测试开发人工智能安全
今天
2
0
JS:异步 - 面试惨案

为什么会写这篇文章,很明显不符合我的性格的东西,原因是前段时间参与了一个面试,对于很多程序员来说,面试时候多么的鸦雀无声,事后心里就有多么的千军万马。去掉最开始毕业干了一年的Jav...

xmqywx
今天
2
0
Win10 64位系统,PHP 扩展 curl插件

执行:1. 拷贝php安装目录下,libeay32.dll、ssleay32.dll 、 libssh2.dll 到 C:\windows\system32 目录。2. 拷贝php/ext目录下, php_curl.dll 到 C:\windows\system32 目录; 3. p...

放飞E梦想O
今天
0
0
谈谈神秘的ES6——(五)解构赋值【对象篇】

上一节课我们了解了有关数组的解构赋值相关内容,这节课,我们接着,来讲讲对象的解构赋值。 解构不仅可以用于数组,还可以用于对象。 let { foo, bar } = { foo: "aaa", bar: "bbb" };fo...

JandenMa
今天
1
0
OSChina 周一乱弹 —— 有人要给本汪介绍妹子啦

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @莱布妮子 :分享水木年华的单曲《中学时代》@小小编辑 手机党少年们想听歌,请使劲儿戳(这里) @须臾时光:夏天还在做最后的挣扎,但是晚上...

小小编辑
今天
68
8

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部