数据库中用一个值来保存多种情况:二进制和按位异或

广告位招租
扫码页面底部二维码联系

这篇文章是我刚工作一年的时候写的,现在回【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。读起来,也挺佩服当初自己的思考精神,不一【转载请注明来源】【未经授权禁止转载】定要用到生产环境,但是是一个非常不错是思本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。考过程。

著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。
本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net

例如,某个房间可从[灯,床,桌,椅,杯子著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。,饮水机……]这些器具中挑选,从而组成这【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。个房间的装潢。我们可能会设计一个房间表,【作者:唐霜】原创内容,盗版必究。再设计一个器具表,再设计一个关系表,通过【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。这个关系表来保存它们之间的对应关系。但是著作权归作者所有,禁止商业用途转载。未经授权,禁止复制转载。这样的效率明显是比较差的,需要同时查询三【关注微信公众号:wwwtangshuangnet】【关注微信公众号:wwwtangshuangnet】张表才能完成。

本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。

为了不适用关系表,我们还可以在房间表中设【版权所有,侵权必究】著作权归作者所有,禁止商业用途转载。计一个字段,通过一个有规律的字符串来保存本文版权归作者所有,未经授权不得转载。【未经授权禁止转载】器具表的器具ID,例如:

【原创内容,转载请注明出处】原创内容,盗版必究。【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。【转载请注明来源】
1,2,3,7

下面,我们提供一种通过一个值来计算即可获【关注微信公众号:wwwtangshuangnet】转载请注明出处:www.tangshuang.net得这一器具组合的结果,方法如下:

转载请注明出处:www.tangshuang.net【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。
array(
  '1' => '灯'
  '2' => '床',
  '4' => '桌',
  '8' => '椅子',
  '16' => '饮水机',
  ……
);

如果我们将5保存到数据库中,我们可以立马原创内容,盗版必究。原创内容,盗版必究。知道,这个房间有“灯”和“桌”,而如果保【本文受版权保护】著作权归作者所有,禁止商业用途转载。存的是23,则一定有“灯”“床”“桌”和【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】“饮水机”。

著作权归作者所有,禁止商业用途转载。【作者:唐霜】著作权归作者所有,禁止商业用途转载。

给每一个器具一个给定的值,这个值一定是2本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。的n次方(n>=0),这样就可以保【版权所有,侵权必究】未经授权,禁止复制转载。证相加之后的值可以反解。这个情况的核心原【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】理在于,给定任何数值的前面数值相加和,一【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。定小于当前数值。如何进行反解呢?

【版权所有】唐霜 www.tangshuang.net本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。【本文受版权保护】

例如我们拿到一个值为N,那么我们可以首先本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net找到最大的2^n,确定2^n是一定有的,【作者:唐霜】【关注微信公众号:wwwtangshuangnet】如果没有2^n,就不可能相加得到N。

本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】原创内容,盗版必究。

接下来我们获得M = N –【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。 2^n,找到最大的2^m,再进行M &【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。#8211; 2^m,如此推论下去,直到转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】减完为止。

【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。

那么怎获得最大的2^n呢?【本文首发于唐霜的博客】

转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】【作者:唐霜】【版权所有】唐霜 www.tangshuang.net
$n = (int)log(N,2);

log函数在PHP4+之后内置,用于取对【未经授权禁止转载】著作权归作者所有,禁止商业用途转载。数,返回值为float类型,但我们仅需要转载请注明出处:www.tangshuang.net【未经授权禁止转载】整数部分,因此前面加(int)。

【本文受版权保护】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。未经授权,禁止复制转载。

例如N=22,那么$n=4,再去计算2^【访问 www.tangshuang.net 获取更多精彩内容】【本文受版权保护】4,就是16。

未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。

通过这个方法,我们可以非常顺利的在一个数原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。据表中用一个值保存多种情况。但是,这也有【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net一定的适用范围,比如这些情况最好是固定不原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。变的,2n值不能太大等等。通过这种方法可【未经授权禁止转载】本文作者:唐霜,转载请注明出处。以用该值进行权重设计,进行排序,但是不能本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。用于条件检索,比如你想检索数据库中包含“【转载请注明来源】未经授权,禁止复制转载。床”的房间,你就不好进行检索,因为大部分【本文首发于唐霜的博客】【版权所有,侵权必究】房间的该值可能都大于2.所以,在使用这种原创内容,盗版必究。【本文首发于唐霜的博客】方法时,应该根据实际需要进行考虑。

原创内容,盗版必究。【未经授权禁止转载】本文作者:唐霜,转载请注明出处。

更新:【关注微信公众号:wwwtangshuangnet】

【作者:唐霜】本文作者:唐霜,转载请注明出处。【转载请注明来源】【转载请注明来源】

在数据库中,我们可以使用一种序列化的类二【关注微信公众号:wwwtangshuangnet】【原创不易,请尊重版权】进制字符串来保存多个值,当这个二进制值是【原创内容,转载请注明出处】【版权所有】唐霜 www.tangshuang.net以01组成时,实际上就可以换算成为一个十转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】进制数,从而也就实现了一个十进制值保存多【作者:唐霜】转载请注明出处:www.tangshuang.net种情况的目的。

【版权所有】唐霜 www.tangshuang.net【本文受版权保护】【版权所有】唐霜 www.tangshuang.net

下面我们来做一个演示。本文版权归作者所有,未经授权不得转载。

著作权归作者所有,禁止商业用途转载。【版权所有】唐霜 www.tangshuang.net【本文首发于唐霜的博客】【本文首发于唐霜的博客】

例如我们在订票系统中,规定某一个活动每天【原创内容,转载请注明出处】原创内容,盗版必究。分为6个场次,每个场次2个小时,因此实际未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。上就把一天的12个小时分为了6份,分别是9:00-11:00,11:00-13:00,13:00-15:00,15:00-17:00,17:00-19:00:19:00-21:00,我们用“xxxxxx”(x取0或1)来转载请注明出处:www.tangshuang.net【原创不易,请尊重版权】表示,现在,我们要记录这些场次是否全部被本文作者:唐霜,转载请注明出处。著作权归作者所有,禁止商业用途转载。定完了,用1表示全部被订完,所以“010【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】110”就表示11:00-13:00,1著作权归作者所有,禁止商业用途转载。【原创内容,转载请注明出处】5:00-17:00,17:00-19:本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。00这三个场次已经被订完了,不能再对外售【原创不易,请尊重版权】著作权归作者所有,禁止商业用途转载。票。

【原创内容,转载请注明出处】原创内容,盗版必究。原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net

我们在数据库中怎么保存呢?本文作者:唐霜,转载请注明出处。

【版权所有,侵权必究】【作者:唐霜】【本文首发于唐霜的博客】

php提供了将二进制转换为十进制的函数b转载请注明出处:www.tangshuang.net【未经授权禁止转载】indec(),我们先将二进制值转换为十【关注微信公众号:wwwtangshuangnet】【本文首发于唐霜的博客】进制值后,再保存到数据库中。而当我们要使原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】用时,从数据库中取出十进制值,再使用de【原创不易,请尊重版权】【关注微信公众号:wwwtangshuangnet】cbin()将值转换为二进制值,当然,我未经授权,禁止复制转载。【版权所有】唐霜 www.tangshuang.net们要补全最后得到的二进制值的位数,也就是本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】前面加0,然后再进行字符串数组处理,进行【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】对比。

【本文首发于唐霜的博客】原创内容,盗版必究。【作者:唐霜】【本文受版权保护】本文作者:唐霜,转载请注明出处。

在编程世界中,还有一个比较好玩的算法,叫【关注微信公众号:wwwtangshuangnet】【原创内容,转载请注明出处】“按位异或”。按位,就是以二进制的形式进未经授权,禁止复制转载。【本文受版权保护】行计算,“按位异或”就是两个位的值不同时【转载请注明来源】原创内容,盗版必究。返回1,否则返回0。通过这个运算,我们可【本文首发于唐霜的博客】【访问 www.tangshuang.net 获取更多精彩内容】以得到看上去非常复杂的结果。在php中,【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。运算为“^”。下面我们来进行一下演算。

原创内容,盗版必究。【作者:唐霜】未经授权,禁止复制转载。【访问 www.tangshuang.net 获取更多精彩内容】

001011 ^ 011010 = 01本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。0001 (1式,注意,开头的0会被忽略【原创内容,转载请注明出处】【访问 www.tangshuang.net 获取更多精彩内容】,因此不要把开头的0也算进来)

未经授权,禁止复制转载。【本文首发于唐霜的博客】本文版权归作者所有,未经授权不得转载。

提按位异或有什么意义呢?因为二进制值可以【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】和十进制值进行转换,因此我们将二进制值转【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。换为十进制值进行按位异或之后,得到的值也【原创不易,请尊重版权】【原创内容,转载请注明出处】是十进制的,我们只有将这些十进制数转换为著作权归作者所有,禁止商业用途转载。【本文受版权保护】二进制字串后,才能发现规律,但是如果我们【作者:唐霜】著作权归作者所有,禁止商业用途转载。直接用十进制进行计算,却能快速得到结果。

【本文首发于唐霜的博客】【本文受版权保护】原创内容,盗版必究。【作者:唐霜】

下面我们就来演算一次,我们拿(1式)来看原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。。如果将二进制数转换为十进制,我们就能得【作者:唐霜】【本文受版权保护】

著作权归作者所有,禁止商业用途转载。【本文受版权保护】转载请注明出处:www.tangshuang.net【原创内容,转载请注明出处】

11 ^ 26 = 17本文作者:唐霜,转载请注明出处。

【本文受版权保护】【未经授权禁止转载】未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。

那事实的结果是不是这样呢?你可以在你的p著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。hp程序中写上:

【转载请注明来源】著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。【关注微信公众号:wwwtangshuangnet】【访问 www.tangshuang.net 获取更多精彩内容】
<?php
echo 11 ^ 26;

是的,结果就是这样。可是,这个复杂的运算原创内容,盗版必究。转载请注明出处:www.tangshuang.net有什么用呢?它可以用于比较。比如我们的数本文版权归作者所有,未经授权不得转载。【作者:唐霜】据库中存放了11,转换为二进制就是“00著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net1011”,也就是表示这一天的场次中,对【作者:唐霜】【未经授权禁止转载】应的那三个时段已经满票了。但是如果我们现【原创不易,请尊重版权】原创内容,盗版必究。在正好要进行对比,看看这一天中17:00【转载请注明来源】【版权所有,侵权必究】-19:00这个时段是否满票,我们怎么能转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】准确知道11这个值转换为001011后,本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】第5个位上的值是否为1呢?

著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。

我们只需要用这种思路来解决即可:【版权所有,侵权必究】

【版权所有,侵权必究】转载请注明出处:www.tangshuang.net【本文受版权保护】

xxxxxx ^ 000010 = ?未经授权,禁止复制转载。

本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net【未经授权禁止转载】【本文首发于唐霜的博客】

其中xxxxxx是我们要对比的值,比如当【未经授权禁止转载】【版权所有,侵权必究】它等于11时,也就是001011时,等式著作权归作者所有,禁止商业用途转载。【本文首发于唐霜的博客】的右边会得到001001(9)。我们再来【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】看另一个算式:

【关注微信公众号:wwwtangshuangnet】【转载请注明来源】【本文首发于唐霜的博客】

xxxxxx ^ 000000 = ?【访问 www.tangshuang.net 获取更多精彩内容】

【本文首发于唐霜的博客】【转载请注明来源】【未经授权禁止转载】

等式右边会得到本身。本文作者:唐霜,转载请注明出处。

【关注微信公众号:wwwtangshuangnet】【本文受版权保护】转载请注明出处:www.tangshuang.net本文版权归作者所有,未经授权不得转载。

如果我们再用001001(9)去按位异或原创内容,盗版必究。转载请注明出处:www.tangshuang.net000010,则会得到001011(11【作者:唐霜】未经授权,禁止复制转载。)。

【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】

我们得到的结论就是,凡是用xxxxx去按【本文受版权保护】【本文受版权保护】位异或yyyyyy(其中只有一个y为1,【原创不易,请尊重版权】【作者:唐霜】其他全为0),得到的结果比自身小的,则对著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】应位置上的值为1,得到的结果比自身大的,【本文受版权保护】【原创内容,转载请注明出处】对应的位置上为0。通过这种方法,也就找到本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。了哪个时间段是被订满票的。

本文版权归作者所有,未经授权不得转载。原创内容,盗版必究。【本文受版权保护】

为什么大于自身的,对应的位置上就一定为0本文版权归作者所有,未经授权不得转载。【原创内容,转载请注明出处】呢?因为0^1=1,而二进制数是01构成【版权所有】唐霜 www.tangshuang.net【作者:唐霜】的,也就是说0和1碰上0时,都不会变化,转载请注明出处:www.tangshuang.net【转载请注明来源】而只有0碰上1时才会变化。说白了,用任何【本文受版权保护】著作权归作者所有,禁止商业用途转载。一个二进制数去按位异或000100,结果著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。发生的情况就两种,一种是第四个位置上的值【原创不易,请尊重版权】【未经授权禁止转载】由1变为0(结果值相对于本身值而言),这【未经授权禁止转载】【访问 www.tangshuang.net 获取更多精彩内容】种情况下该值变小,一种是第四个位置上的值【访问 www.tangshuang.net 获取更多精彩内容】【原创内容,转载请注明出处】由0变为1,这种情况下该值变大。了解了这本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】个原理之后,我们只需要在数据库中保存二进【版权所有】唐霜 www.tangshuang.net原创内容,盗版必究。制转换而来的十进制值,在查询时,用对比值【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。(二进制转换而来的十进制值)去按位异或一【本文受版权保护】【本文受版权保护】下,即可得到我们想要的结果。

本文版权归作者所有,未经授权不得转载。本文版权归作者所有,未经授权不得转载。【转载请注明来源】

我们创建如下表结构,sale_over在本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。实际存储时,我们转换为十进制整数进行存储【本文受版权保护】【关注微信公众号:wwwtangshuangnet】,这里方便演示用二进制表示。每次在用户下【本文受版权保护】【本文受版权保护】订单时对票数进行检查,如果该时段已经有2转载请注明出处:www.tangshuang.net【本文首发于唐霜的博客】0张票被订出,就在下表中更新一条记录,把【访问 www.tangshuang.net 获取更多精彩内容】转载请注明出处:www.tangshuang.net对应的时段改为1.

本文作者:唐霜,转载请注明出处。原创内容,盗版必究。转载请注明出处:www.tangshuang.net【关注微信公众号:wwwtangshuangnet】

table本文作者:唐霜,转载请注明出处。name = object【版权所有】唐霜 www.tangshuang.netorder未经授权,禁止复制转载。

原创内容,盗版必究。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。
id未经授权,禁止复制转载。 object_id【转载请注明来源】 day转载请注明出处:www.tangshuang.net sale_over【版权所有,侵权必究】
1转载请注明出处:www.tangshuang.net 5本文作者:唐霜,转载请注明出处。 2015-08-23【版权所有】唐霜 www.tangshuang.net 011000转载请注明出处:www.tangshuang.net
2【未经授权禁止转载】 8本文作者:唐霜,转载请注明出处。 2015-08-24原创内容,盗版必究。 100101【本文首发于唐霜的博客】
3【版权所有】唐霜 www.tangshuang.net 5【转载请注明来源】 2015-08-25转载请注明出处:www.tangshuang.net 010001本文作者:唐霜,转载请注明出处。

例如:本文作者:唐霜,转载请注明出处。

【原创内容,转载请注明出处】【原创内容,转载请注明出处】本文作者:唐霜,转载请注明出处。
SELECT COUNT(id) FROM object_order WHERE object_id=8 AND day='2015-08-20' AND (hours ^ 2)<hours;

这样就可以判断出8月20号这天17:00【版权所有】唐霜 www.tangshuang.net【版权所有】唐霜 www.tangshuang.net-19:00这个时间段是否被订满(如果返著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。回1,则表示被订满了)。

本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。【关注微信公众号:wwwtangshuangnet】著作权归作者所有,禁止商业用途转载。

如果我们不满意用大小比较来进行判断,我们本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net还可以深入发现,按位异或结果与原值之间的著作权归作者所有,禁止商业用途转载。【未经授权禁止转载】差值,正好是用来异或的值,也就是满足下面未经授权,禁止复制转载。【转载请注明来源】的等式:

【本文受版权保护】【版权所有】唐霜 www.tangshuang.net【作者:唐霜】【原创内容,转载请注明出处】
|m ^ n - m| = n (n为yyyyyy,只有一个y为1,其他为0)

|x|是指绝对值,当不取觉得值,得到的为【本文首发于唐霜的博客】转载请注明出处:www.tangshuang.net负数时,说明结果变小了,那么原值对应的位著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】置上也就是1,而如果得到的为正数,说明结【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net果变大,对应的位置上就为0。所以,上述s未经授权,禁止复制转载。【版权所有,侵权必究】ql,我们还可以这样去改:

本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【本文受版权保护】【本文受版权保护】【作者:唐霜】
SELECT COUNT(id) FROM object_order WHERE object_id=8 AND day='2015-08-20' AND (hours ^ 2 + 2)=hours;

如果查到了结果,说明8这个活动8月20号本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。这天17:00-19:00这个时间段被订本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。满。

本文版权归作者所有,未经授权不得转载。转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net【作者:唐霜】【原创不易,请尊重版权】

这种魔术般的使用方法,你是否思考过呢?未经授权,禁止复制转载。

原创内容,盗版必究。【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】【版权所有】唐霜 www.tangshuang.net

再议【本文受版权保护】

本文作者:唐霜,转载请注明出处。本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。

实际上,一个二进制数,我们将它转换为十进【版权所有】唐霜 www.tangshuang.net转载请注明出处:www.tangshuang.net制时,将它的各个位置值(从右往左,以0为本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。开始)作为次数求2的次幂,再乘以该位置上未经授权,禁止复制转载。【版权所有,侵权必究】的数,再相加,即得到该二进制数对应的十进【本文受版权保护】著作权归作者所有,禁止商业用途转载。制数,例如:

【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】【关注微信公众号:wwwtangshuangnet】【版权所有】唐霜 www.tangshuang.net【未经授权禁止转载】

10100 = 0【关注微信公众号:wwwtangshuangnet】(2^0) + 0【版权所有,侵权必究】(2^1) + 1【本文首发于唐霜的博客】(2^3) + 0【版权所有,侵权必究】(2^4) + 1*(2^5) = 8 【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。+ 32 = 40

未经授权,禁止复制转载。原创内容,盗版必究。【本文受版权保护】

这样去观察,就发现实际上8和32,就是我【原创不易,请尊重版权】本文版权归作者所有,未经授权不得转载。们第一次接触这种算法时,将它们作为一个数【转载请注明来源】著作权归作者所有,禁止商业用途转载。组的索引值,进行物品的索引进行计算。

原创内容,盗版必究。本文版权归作者所有,未经授权不得转载。【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。

接下来,我们要更换场景,每个时段仅可以被【版权所有,侵权必究】未经授权,禁止复制转载。一个人预订,用户每一次下订单完成之后,形【关注微信公众号:wwwtangshuangnet】原创内容,盗版必究。成一条记录,这些记录以上述形式存储,得到【作者:唐霜】本文作者:唐霜,转载请注明出处。如下订单数据表:

【转载请注明来源】【版权所有】唐霜 www.tangshuang.net本文作者:唐霜,转载请注明出处。本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】

table原创内容,盗版必究。name = user本文版权归作者所有,未经授权不得转载。order本文作者:唐霜,转载请注明出处。

【版权所有,侵权必究】【访问 www.tangshuang.net 获取更多精彩内容】【原创不易,请尊重版权】【本文首发于唐霜的博客】本文作者:唐霜,转载请注明出处。
id【原创不易,请尊重版权】 user_id【关注微信公众号:wwwtangshuangnet】 object_id【访问 www.tangshuang.net 获取更多精彩内容】 day原创内容,盗版必究。 hours转载请注明出处:www.tangshuang.net
1【作者:唐霜】 2【未经授权禁止转载】 5【原创内容,转载请注明出处】 2015-08-23【版权所有】唐霜 www.tangshuang.net 011000【本文首发于唐霜的博客】
2【本文首发于唐霜的博客】 3本文版权归作者所有,未经授权不得转载。 8【原创内容,转载请注明出处】 2015-08-24未经授权,禁止复制转载。 100000本文作者:唐霜,转载请注明出处。
3【版权所有,侵权必究】 2【关注微信公众号:wwwtangshuangnet】 5【作者:唐霜】 2015-08-24【访问 www.tangshuang.net 获取更多精彩内容】 000001【关注微信公众号:wwwtangshuangnet】

类似这样的订单记录,hours字段中每个转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。位置上的1最多出现1次,怎么样确定某一天著作权归作者所有,禁止商业用途转载。本文作者:唐霜,转载请注明出处。的所有票都已经定出去了呢?

【访问 www.tangshuang.net 获取更多精彩内容】本文作者:唐霜,转载请注明出处。【版权所有,侵权必究】本文作者:唐霜,转载请注明出处。

其实这是最简单的,就是对该字段进行求和,转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。例如:

【访问 www.tangshuang.net 获取更多精彩内容】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。【访问 www.tangshuang.net 获取更多精彩内容】【未经授权禁止转载】
SELECT SUM(hours) FROM user_order WHERE object_id=8 AND day='2015-08-20';

如果最终得到的值为111111,也就是十本文作者:唐霜,转载请注明出处。【访问 www.tangshuang.net 获取更多精彩内容】进制的63,则说明该天各个时段已订满,不【作者:唐霜】未经授权,禁止复制转载。能再进行预订。

【关注微信公众号:wwwtangshuangnet】【版权所有,侵权必究】【转载请注明来源】【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。

最后一种情况则是对上面两张场景的结合,也未经授权,禁止复制转载。【原创不易,请尊重版权】就是每个时段最多可以被预订20张票,数据【本文受版权保护】【访问 www.tangshuang.net 获取更多精彩内容】库中记录的是单个用户的订单。

【转载请注明来源】原创内容,盗版必究。【转载请注明来源】

当然,遇到这种情况,其实我们可以准备两张【未经授权禁止转载】【版权所有,侵权必究】表,一张是用户的订单表:

【版权所有,侵权必究】【原创不易,请尊重版权】【作者:唐霜】

table转载请注明出处:www.tangshuang.netname = user【原创不易,请尊重版权】order著作权归作者所有,禁止商业用途转载。

本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。著作权归作者所有,禁止商业用途转载。【原创不易,请尊重版权】
id【原创内容,转载请注明出处】 user_id【原创内容,转载请注明出处】 object_id【版权所有】唐霜 www.tangshuang.net day转载请注明出处:www.tangshuang.net hours【原创内容,转载请注明出处】
1著作权归作者所有,禁止商业用途转载。 2【关注微信公众号:wwwtangshuangnet】 5本文作者:唐霜,转载请注明出处。 2015-08-23转载请注明出处:www.tangshuang.net 011000未经授权,禁止复制转载。
2【作者:唐霜】 3【访问 www.tangshuang.net 获取更多精彩内容】 8【本文受版权保护】 2015-08-24本文作者:唐霜,转载请注明出处。 100000【关注微信公众号:wwwtangshuangnet】
3本文版权归作者所有,未经授权不得转载。 2【版权所有】唐霜 www.tangshuang.net 5【原创内容,转载请注明出处】 2015-08-24【原创内容,转载请注明出处】 000001未经授权,禁止复制转载。

(第一条记录表示用户2在2015-08-【关注微信公众号:wwwtangshuangnet】【未经授权禁止转载】23这天预订了5这个活动的11点13点这著作权归作者所有,禁止商业用途转载。转载请注明出处:www.tangshuang.net两个时段的票)

【原创不易,请尊重版权】【未经授权禁止转载】【关注微信公众号:wwwtangshuangnet】本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。

一张用来在每次用户订单完成时,对该时段进【本文首发于唐霜的博客】著作权归作者所有,禁止商业用途转载。行判断,如果这个时段已经卖出20张,就改【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。为1,进行更新操作的场次预订情况表:

【作者:唐霜】【访问 www.tangshuang.net 获取更多精彩内容】【版权所有,侵权必究】原创内容,盗版必究。【版权所有】唐霜 www.tangshuang.net

table【原创内容,转载请注明出处】name = object本文版权归作者所有,未经授权不得转载。order【未经授权禁止转载】

未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net著作权归作者所有,禁止商业用途转载。
id【原创不易,请尊重版权】 object_id著作权归作者所有,禁止商业用途转载。 day本文作者:唐霜,转载请注明出处。 sale_over【未经授权禁止转载】
1【原创不易,请尊重版权】 5【版权所有,侵权必究】 2015-08-23【未经授权禁止转载】 011000本文作者:唐霜,转载请注明出处。
2【原创内容,转载请注明出处】 8【未经授权禁止转载】 2015-08-24【关注微信公众号:wwwtangshuangnet】 100101原创内容,盗版必究。
3未经授权,禁止复制转载。 5未经授权,禁止复制转载。 2015-08-25本文作者:唐霜,转载请注明出处。 010001本文作者:唐霜,转载请注明出处。

但是这样的话,我们通过该表,仅能判断是否转载请注明出处:www.tangshuang.net转载请注明出处:www.tangshuang.net卖完,而不知道已经卖了多少张。为了解决这【作者:唐霜】本文作者:唐霜,转载请注明出处。个问题,我们夸张的做法是,直接在这个表的【转载请注明来源】【原创内容,转载请注明出处】基础上进行扩展,增加20个字段,每个字段本文作者:唐霜,转载请注明出处。【转载请注明来源】对应一个时段,用来记录所卖出的票数,但是【本文受版权保护】【版权所有,侵权必究】这样实在太蠢了。由于二进制方式,无法在每转载请注明出处:www.tangshuang.net【转载请注明来源】个位置上表示实际的值,例如在第2个位置上未经授权,禁止复制转载。本文作者:唐霜,转载请注明出处。用3来表示卖出3张,这是我们无法做到的,【转载请注明来源】【访问 www.tangshuang.net 获取更多精彩内容】所以,我们可以通过前面一张用户下的订单列【访问 www.tangshuang.net 获取更多精彩内容】著作权归作者所有,禁止商业用途转载。表来进行计算,从而找出某个位置上是否已经【转载请注明来源】原创内容,盗版必究。存在20个1.

【原创内容,转载请注明出处】【本文首发于唐霜的博客】【版权所有,侵权必究】本文版权归作者所有,未经授权不得转载。本文作者:唐霜,转载请注明出处。

实际上,我们现在要解决的,就是查出每个时【未经授权禁止转载】转载请注明出处:www.tangshuang.net段已经订出了多少张票。

未经授权,禁止复制转载。转载请注明出处:www.tangshuang.net【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】

我们可以用【版权所有,侵权必究】

【作者:唐霜】著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。
SELECT COUNT(id) FROM user_order WHERE object_id=8 AND day='2015-08-20' AND (hours ^ 2 + 2)=hours;

这种方法就可以查出来某个时段的被订数量,【版权所有,侵权必究】原创内容,盗版必究。如果返回值等于20,则说明该时段已经被定【版权所有,侵权必究】【版权所有,侵权必究】完了。但是,我们如何从所有的记录中,找出本文版权归作者所有,未经授权不得转载。【版权所有】唐霜 www.tangshuang.net那些天的席位被全部定光呢?因为我们不打算【本文受版权保护】未经授权,禁止复制转载。使用objectorder表来记录,而是想直接通过use著作权归作者所有,禁止商业用途转载。原创内容,盗版必究。rorder进行查询,所以我们不仅要判断某【转载请注明来源】未经授权,禁止复制转载。个位置上的为1的记录数是否为20,而且要【未经授权禁止转载】【本文受版权保护】判断所有的位置。

【关注微信公众号:wwwtangshuangnet】本文作者:唐霜,转载请注明出处。未经授权,禁止复制转载。本文版权归作者所有,未经授权不得转载。【版权所有,侵权必究】

最笨的方法就是连续判断6次,对每个位置都【版权所有】唐霜 www.tangshuang.net【访问 www.tangshuang.net 获取更多精彩内容】进行统计,最终进行判断。但是这明显不符合【未经授权禁止转载】转载请注明出处:www.tangshuang.net我们的要求。

【访问 www.tangshuang.net 获取更多精彩内容】【作者:唐霜】本文版权归作者所有,未经授权不得转载。

实际上,我们仍然使用求和即可完成,我们在原创内容,盗版必究。【转载请注明来源】前面进行求和时,只需要用111111进行转载请注明出处:www.tangshuang.net原创内容,盗版必究。对比,也就是十进制的63进行对比,而这次【未经授权禁止转载】【原创内容,转载请注明出处】,我们用20个111111进行对比,也就【作者:唐霜】原创内容,盗版必究。是63*20 = 1260进行对比即可。

原创内容,盗版必究。【作者:唐霜】原创内容,盗版必究。【未经授权禁止转载】本文版权归作者所有,未经授权不得转载。
SELECT SUM(hours) FROM user_order WHERE object_id=8 AND day='2015-08-20';

如果得到的返回值等于1260,说明这一天转载请注明出处:www.tangshuang.net本文作者:唐霜,转载请注明出处。的所有场次已经完全订出去了。

【转载请注明来源】本文版权归作者所有,未经授权不得转载。著作权归作者所有,禁止商业用途转载。本文版权归作者所有,未经授权不得转载。【访问 www.tangshuang.net 获取更多精彩内容】

用这种方法处理数据库中保存有规律的多种情本文版权归作者所有,未经授权不得转载。未经授权,禁止复制转载。况保存,就变得轻松有趣了。

原创内容,盗版必究。【关注微信公众号:wwwtangshuangnet】未经授权,禁止复制转载。【本文受版权保护】

2018-12-18 4940

为价值买单,打赏一杯咖啡

本文价值49.4RMB