介紹Mysql位元運算簡化一對多關係

coldplay.xixi
發布: 2020-12-18 09:21:26
轉載
3186 人瀏覽過

mysql教學欄位介紹位元運算簡化一對多關係

介紹Mysql位元運算簡化一對多關係

推薦(免費):mysql教學

語法

#& : 位元與,二進位位元同時都為1的位元設為1。
| :  按位或,二進位位有一個位元為1就為1.
^ : 按位異或,對應位的二進位數不同時,對應位的結果才為1;如果兩個對應位數都為0或都為1,則對應位的結果為0。

原理

$a = 6 转化为2进制为 110
$b = 3 转化为2进制为 11
$a & $b即是 110 与 11
将$a和$b中都为1的位设为1,位数不够的补0.即110 与 011
运算结果010,转化为十进制结果为2
登入後複製

應用場景

每個景點包含許多屬性,例如適合旅遊的月份,我們一般的做法可能有兩種:

  1. 是增加一個varchar字段,每個月份之間用一個特殊符號分隔保存,例如:"1,2,22 ,65,7"
  2. 建立一個關係表,在這裡不能使用1-12的數字來表示月份,而是使用1,2,4,8,16,32, 64,128,512,1024,2048,4096來表示,如果是多個月份,可以相互組合相加,之後儲存為一個值。
    例如 1,10,12月份,就可以儲存1 512 4096=4609,4096 這個值。

這個技巧適用於屬性較少的一對多的場景,可以儲存1個或多個,太多的話還是推薦試用關係表。常用的屬性有:月份,訊息提醒類型,各種有限的類型組合等等。

使用技巧:

-- 添加一个分类 用 “|”
SELECT (4|2|1); --- = 7

-- 去掉一个分类,用“^”
SELECT 7 ^ 1;

-- 当我们需要查询某个月份的景点时,例如查询3月份的景点,可使用以下语句:
SELECT * FROM `spots` WHERE `month` & 4 = 4;

-- 当设置某个景点适合某个月份时,例如设置4325的景点适合2月份,可使用下面的语句:
    
UPDATE `spots` SET `month` = `month` | 2 WHERE `id` = 4325

-- 当取消设置某个景点的月份时,可使用下面的语句:
UPDATE `spots` SET` month` = `month` ^ 2 WHERE`id`= 4325

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

SELECT * FROM `spots` WHERE `month` & 6145 = 6145

-- 查询只要适合,1,11,12月份其中一个月份的景点就行
SELECT * FROM `spots` WHERE (`month` & 4096 = 4096) or (`month` & 2048 = 2048) or (`month` & 1 = 1)
登入後複製

以上是介紹Mysql位元運算簡化一對多關係的詳細內容。更多資訊請關注PHP中文網其他相關文章!

相關標籤:
來源:jianshu.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!