ホームページ  >  記事  >  データベース  >  1 対多の関係を簡素化するための Mysql ビット操作の導入

1 対多の関係を簡素化するための Mysql ビット操作の導入

coldplay.xixi
coldplay.xixi転載
2020-12-18 09:21:263195ブラウズ

mysql チュートリアルこのコラムでは、1 対多の関係を簡素化するためのビット操作を紹介します

1 対多の関係を簡素化するための Mysql ビット操作の導入

# 推奨 (無料): mysql チュートリアル

構文

& : ビット単位の AND、バイナリ ビットを同時にすべて 1 のビットが 1 に設定されます。
| : ビットごとの OR、1 つのバイナリ ビットが 1 の場合、それは 1 になります。
^ : ビットごとの XOR、対応するビットの 2 進数が異なる場合, 対応するビットの結果のみが 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

適用シナリオ

各景勝地には、観光に適した月など、多くの属性が含まれており、一般的に、 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 対多の シナリオに適しています。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)

以上が1 対多の関係を簡素化するための Mysql ビット操作の導入の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjianshu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。