位運算-設計資料庫表的多選狀態欄位

4pmzzzzzzzzzz發表於2022-11-24

案例:儲存使用者的興趣愛好,多選。
一個人肯定有打籃球,看書等多個愛好。

表:users使用者表、hobbys興趣愛好表、user_has_hobbys使用者與興趣愛好關聯表

欄位:hobby(int),資料儲存方式:1,2,3。1代表籃球 2代表看書 3代表足球

目前自己認為的最好方法

//model 裡定義(hobby)欄位
const HOBBY_BASKETBALL =  1  <<  0;//籃球(1)
const HOBBY_READ_BOOK =  1  <<  1;//看書(2)
const HOBBY_FOOTBALL =  1  <<  2;//足球(4)

//資料表(users)
id(使用者ID) hobby(興趣)  name(使用者名稱)
1            1           小花
2            2           小紅
3            3           小張
4            4           小軍
5            5           小明
6            6           小李
7            7           小天

實操查詢

# 查詢興趣愛好為看書的
SELECT id,hobby,name FROM users WHERE hobby & 2
//結果為id:2,3,6,7

# 查詢興趣愛好為籃球or看書or足球(1+2+4=7)的
SELECT id,hobby,name FROM users WHERE hobby & 7
//結果為id:1,2,3,4,5,6,7

# 查詢興趣愛好為籃球and看書and足球(1+2+4=7)的
SELECT id,hobby,name FROM users WHERE hobby & 7 = 7
//結果為id:7

#查詢的時候只用把要查詢的興趣愛好相加(前端傳值也是一樣相加),即可,簡單方法,省事,高效

看不懂位運算 可搜尋看原碼、反碼、補碼資料,以及看下面解釋

//欄位欄位hobby(int)
1 (0001):代表籃球;第一位
2 (0010):代表看書;第二位
4 (0100):代表足球;第三位

30001+0010=0011):代表籃球、看書;
50001+0100=0101):代表籃球、足球;
60010+0100=0110):表示看書、足球;
70001+0010+0100=0111):表示籃球、看書、足球;
本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章