二进制数字的每一位表示一个标签,1 表示被贴了这个标签,0 表示未被贴这个标签。 同时,标签在表中的 ID 表示二进制中对应的位。举个例子: 标签表:
tag_id tag_name
1 标签-1
2 标签-2
3 标签-3
商品表:
goods_id tag_id(二进制,省略前置0)
1 1(1)
2 3(11)
3 5(101)
4 6(110)
5 7(111)
6 4(100)
当要选择 标签-1 的商品时,可以通过位运算中的与运算(&),来获取二进制右起第一位为1的商品,偏移值 offset 为: 1<<(tag_id-1),当商品表中的 tag_id & offset 的结果与 offset 相等的时候,即得到了 标签-1 的商品,SQL 如下:
SELECT * FROM `商品表` WHERE tag_id & (1<<(1-1))=1<<(1-1)
得到的结果:
goods_id tag_id(二进制,省略前置0)
1 1(1)
2 3(11)
3 5(101)
5 7(111)
当要选出 标签-1、标签-2,标签-3 的商品时,offset = (1<<(1-1))+(1<<(2-1))+(1<<(3-1)),SQL 如下:
SELECT * FROM `商品表` WHERE tag_id & ((1<<(1-1))+(1<<(2-1))+(1<<(3-1)))=(1<<(1-1))+(1<<(2-1))+(1<<(3-1))
得到结果:
goods_id tag_id(二进制,省略前置0)
5 7(111)
通过这种方式,就可以抛弃掉关联表,直接通过位运算,获取到相应标签的数据。