zoukankan      html  css  js  c++  java
  • 位运算解决多标签问题【原创】

    日常开发中经常用到一个酒店下有多个标签比如酒店的风格特点有:无柱 场地方正 豪华 美食 自然采光 园林草坪 温泉 景区周边 水景 泳池 中式院落 西式装修 少数民族 会场进车 高尔夫

    我们一般都会对其进行编号:

    {
        '1':  无柱,
        '2':  场地方正,
        '3':  豪华,
        '4':  美食,
        '5':  自然采光,
        '6':  园林草坪,
        '7':  温泉,
        '8':  景区周边,
        '9':  水景,
        '10': 泳池,
         '11': 中式院落,
        '12': 西式装修,
        '13': 少数民族,
        '14': 会场进车,
        '15': 高尔夫
    }
    

    存放在数据库时主要是存放该值的key值,如果一个酒店只有一个标签是没什么问题的,但是如果一个酒店有多个标签,并且又需要支持单个标签也可以筛选出该酒店就需要用到位运算,那具体这个位运算怎么设计呢?需要我们一起看看。

    我们假设某个酒店存在 无柱 美食 泳池 三个标签
    这样我们可以设计一个长度为15的二进制数,满足条件的位为1,不满足的为0,那该酒店的二进制数为 000001000001001
    转换为十进制为 521
    这样我们存放到数据库里面的数值为 521

    那这样怎么获取该酒店是否有该标签呢?

    我们可以采用位运算的与(&)运算:两个位都为1时,结果才为1

    那如果我们要判断无柱这个标签是否存在该酒店
    首先获取代表无柱的二进制数000000000000001
    然后转换成10进制为1,
    最后我们可以通过 tags & 1 来判断该酒店是否有无柱这个标签。

    数据库查询语句为:

    SELECT * from hotel_info WHERE (tags & 1);
    SELECT * from hotel_info WHERE (tags & 4);
    SELECT * from hotel_info WHERE (tags & 10);
    

    好了,今天的分享就到这里,明天见

  • 相关阅读:
    Kibana: missing authentication credentials for REST request
    MySQL命令速记
    VIM常用命令简记
    Linux常用命令简记
    袁永福的C#编程书籍,电子工业出版社出版。
    发布DCWriter电子病历文本编辑器
    袁永福的博客系列文章链接集合
    ssh隧道 的命令行和 sshd 服务的配置(gatePort)
    PureMVC(AS3)剖析:设计模式(二)
    Python应用与实践
  • 原文地址:https://www.cnblogs.com/jingh/p/10890969.html
Copyright © 2011-2022 走看看