MySQL位与(&)的妙用

设想这样一个情景,有个学生表,有个党员表记录着是党员,有个贫困学生表记录贫困学生,有个大学生士兵表记录是否参军,我怎么知道学生的各种情况呢,如筛选是党员–贫困学生–参军的学生,党员–贫困学生–未参军的学生?

党员要么是,要么否,贫困学生和是否参军也是,相当于有222=2^3=8种情况

有读者可能会想到,直接连表查询不久完了吗?先查是否是党员,在把是党员的去查是否贫困学生,然后再查是否参军,诚然,这样做是可以的。今天介绍另一种方法。

很巧,几张表(除学生表)都是两种情况要么是要么不是,和二进制一样,用1代表是 0代表否
那么

	非党员--非贫困学生--未参军 = 000 = 0
	非党员--非贫困学生--参军 = 001 = 1
	非党员--贫困学生-未参军 = 010 = 2
	非党员--贫困学生--参军 = 011 = 3
	党员--非贫困学生--未参军 = 100 = 4
	党员--非贫困学生--参军 = 101 = 5
	党员--贫困学生--未参军 = 110 = 6
	党员--贫困学生--参军 = 111 = 7

可以直接在学生表里新增一个字段如type存储上面0-7
然后筛选的时候通过位与的方法进行筛选(位与 0&0=0,0&1=0,1&0=0,1&1=1即全1才1)
比如想筛选

非党员--贫困学生-未参军的学生 = 010 = 2

就可以通过type&7=2 ,来达到目的

  • 解析如下()内代表进制(10)表示10进制 (2)表示2进制

      type(10)=xyz(2), 7(10)=111(2),2=010对应起来
      x&1=0 即x必须=0才符合条件 
      y&1=1 即y必须=1才符合条件 
      z&1=0  即z必须=0才符合条件
      type(2)=010,即type(10)需要为2
      这样就筛选除了想要的数据!
    

假如 要筛选非党员参军的学生,不关心是否是贫困学生,诸君可以试着想想怎么办

type(10)=xyz(2),
x&?=? 
y&?=? 
z&?=? 

对于x来说,想要筛选非党员的学生,那么 0&0=0,0&1=0,1&0=0,1&1=1使用哪个呢

当然是0&1=0 这样就能得到非党员的学生了

如果筛选条件为党员 x=1 如果他是党员那么1&1=1这是我们不需要的, 因此选用x=0,0&1=0 只有非党员的0才能被筛选条件1 筛选出来

  • 得到

    x&?=?为 x&1=0
    
  • 对于y来说,我们不关心是否是为贫困学生,那让他们都通过筛选即y=0或y=1都通过筛选,即y&0=0

      y&?=? 即 y&0=0
    
  • 对于z来说,想要筛选参军的学生 ,z=1才能通过筛选,1&1=1

      z&?=? 即z&1=1 
    

综上

 x&1=0
 y&0=0 
z&1=1 

type&101=001即type&5=1就是非党员参军的学生

总结:想要筛选是否党员 那么设置筛选条件为1,x&1=1那么x=1是党员时才能成立,x&1=0那么x=0非党员时才能成立
筛选时不关心是否党员,那么设置筛选条件为0,x&0=0 x=1,x=0都成立
抽象出来
你想要对某个条件进行筛选那么筛选条件设置为1,结果设置为1和0对应是与否
如果对此条件不关心那么筛选条件设置为0结果也设置为0让其都通过即可

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值