文档章节

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
mysql 使用位运算

如果你不知道什么是位运算的话, 那么请你先去看看基础的C语言教程吧。 与运算 a & b , 或运算 a | b , 异或运算 a ^ b , 或者 你也可以将 与运算理解为 + 法 例如 1|2 = 3 (1+2 = 3) 1|2|...

晨曦之光
2012/03/09
4.7K
0

没有更多内容

加载失败,请刷新页面

加载更多

自定义Ubuntu/Windows双系统引导菜单主题

学习Linux自然少不了要装双系统,其中Ubuntu便是我们用的最多的Linux系统。装完双系统后,Ubuntu会自动生成grub开机引导及菜单,及其丑陋,而且很多我们用不到的选项。今天我们就介绍burg:修...

Linux就该这么学
4分钟前
0
0
Go 并发(二)

Go Mutex 通过Mutex和信道处理竞态条件。 临界区 当程序并发运行时,多个协程不应该同时访问那些修改共享资源的代码,这些修改共享资源的代码称为临界区。 Go中通过Mutex可以避免同时访问临界...

春哥大魔王的博客
7分钟前
0
0
CentOS 7安装和部署Docker

Docker 要求 CentOS 系统的内核版本高于 3.10 ,查看本页面的前提条件来验证你的CentOS 版本是否支持 Docker 。通过 uname -r 命令查看你当前的内核版本 uname -r3.10.0-514.el7.x86_64 1、...

狼王黄师傅
10分钟前
0
0
php扩展可以通过pecl 或者phpize 安装

pecl 算是 php 扩展的一个官方聚合平台,一些比较有名,有特点的扩展会被 pecl 收录,收录后可以通过 pecl 的方式安装。但是更多的扩展是没有收录在 pecl 上的,这些扩展还是需要通过 phpize...

bengozhong
11分钟前
0
0
CentOS中如何安装7ZIP

执行以下命令下载安装: wget http://nchc.dl.sourceforge.net/project/p7zip/p7zip/9.20.1/p7zip_9.20.1_src_all.tar.bz2tar -jxvf p7zip_9.20.1_src_all.tar.bz2cd p7zip_9.20.1make......

凯文加内特
17分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部