您的位置:首页 > 数据库 > MySQL

mysql位运算的应用

2015-01-06 00:00 309 查看
在mysql中,如果某条数据与其它数据存在一对多的关系,一般我们很自然的就会想到建立一个关系表。例如有一个景点信息的数据表,其结构如下:
idint(主键)
namevarchar(景点名)
provinceint(省份)
cityint(城市)
每个景点包含很多属性,例如适合旅游的月份,我们一般的做法可能有两种:一种是增加一个varchar字段,每个月份之间用一个特殊符号分隔保存,例如“1,2,3,11,12”;另一种方法是建立一个关系表,如下:
spots_idint(景点ID)
monthint(适合月份,取值1-12)
第一种方法,查询极不方便,例如想查出适合2月份旅行的景点,就要使用like语句,效率极其低下。第二种方法,只适合景点属性较少的场合。如果景点还包含其它属性,例如“高山”、“草原”之类的分类属性,还有“美食”、“购物”等的主题属性,就要根据每个属性去建立一个关系表,扩展极其不便,查询的时候可能需要联表查询,也影响效率。

我们知道,PHP当中的错误级别常量,是根据二进制位特性而确定的一个个整数,可以简单的通过位运算定制PHP的错误报告。我们也可以将其应用到mysql当中,还是以上面的景点表为例,我们增加一个字段,其结构如下:
idint(主键)
namevarchar(景点名)
provinceint(省份)
cityint(城市)
monthint(适合旅行月份)
其建表语句为:



1

2

3

4

5

6

7

8

9

10

11

CREATE
TABLE

`
spots
`

(

`
id
`

int
(
10
)

unsigned

NOT

NULL

AUTO_INCREMENT
COMMENT

'景点ID'
,

`
name
`

varchar
(
50
)

NOT

NULL

COMMENT

'景点名称'
,

`
province
`

int
(
5
)

unsigned

NOT

NULL

COMMENT

'景点所在省份'
,

`
city
`

int
(
10
)

unsigned

NOT

NULL

COMMENT

'景点所属城市'
,

`
month
`

int
(
10
)

unsigned

NOT

NULL

DEFAULT

'0'

COMMENT

'适合旅行的月份'
,

PRIMARY
KEY

(
`
id
`
)
,

UNIQUE
KEY

`
name
`

(
`
name
`
)
,

KEY

`
location
`

(
`
province
`
,
`
city
`
)

)

ENGINE
=
InnoDB
DEFAULT

CHARSET
=
utf8
COMMENT
=
'景点信息表'

注意:在这里不能使用1-12的数字来表示月份,而是使用1,2,4,8,16,32,64,128,512,1024,2048,4096来表示。
以下为使用技巧:
1. 当我们需要查询某个月份的景点时,例如查询3月份的景点,可使用以下语句:



1

SELECT *

FROM

`
spots
`

WHERE

`
month
`

&

4

=

4

2. 当设置某个景点适合某个月份时,例如设置4325的景点适合2月份,可使用下面的语句:



1

UPDATE

`
spots
`

SET

`
month
`

=

`
month
`

|

2

WHERE

`
id
`

=

4325

3. 当取消设置某个景点的月份时,可使用下面的语句:



1

UPDATE

`
spots
`

SET

`
month
`

=

`
month
`

^

2

WHERE

`
id
`

=

4325

4. 查询同时适合多个月份的数据,例如需要查询设置了11,12,1月份的景点,将其三个月份对应的数值加起来,结果为6146,然后使用这个数值进行查询:



1

SELECT *

FROM

`
spots
`

WHERE

`
month
`

&

6146

=

6146

文章来自:thiniki
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  mysql 位运算 二进制