原始需求:資料庫中存儲了很多微信名稱然後得進行模糊查詢。
Q1:為什麼不進行一對多的設計,可以采用一對多的設計?
A:有時候僅僅為了一個屬性進行建立一張表,會将表的數量變多,在插入和查詢時候進行大量的操作。
資料庫demo設計:
CREATE TABLE `WeNickName` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT '主鍵',
`weNickName` varchar(11) DEFAULT NULL COMMENT '微信名',
`other` int(11) DEFAULT NULL COMMENT '其他資訊',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
一對多的查詢:
情景1:要進行簡單的模糊查詢,例子:輸入“愛”,查出“愛情”、“愛”、“愛情愛”等
查詢方式為:
select * from WeNickName where weNickName like "%愛%"
結果為:
情景2:對資料進行精确模糊查詢,如;輸入天使 查出來 第4和第6條
select * from WeNickName where FIND_IN_SET("天使",weNickName)
結果為:
注意:mysql字元串函數 find_in_set(str1,str2)函數是傳回str2中str1所在的位置索引,str2必須以","分割開。like是廣泛的模糊比對,字元串中沒有分隔符,Find_IN_SET 是精确比對,字段值以英文”,”分隔,Find_IN_SET查詢的結果要小于like查詢的結果。
多對多的查詢:
場景一:輸入多個查詢對象,是模糊查詢,例如:輸入愛情,天使查出來結果是除了第二、三條其他的資料都應該查出來。
select * from WeNickName where weNickName regexp "愛情|天使"
Q2:使用正則表達和like間的效率
A2:效率上正則表達相對效率低下一些,但是在數量比較小的情況下,使用正規表達式能讓sql語句變得簡單
場景二:在多對多情況下,想要精确查詢,輸入天使宜家、天使 那麼僅僅會輸出第六條
目前我還沒有找到比較好且簡潔的方式處理這個問題,如果有人知道如何讓處理這類問題,歡迎在評論中留言。
多對一的查詢
場景一:指多個屬性對一個字元進行模糊查詢,這種場景比較少見,基本的sql模式語句模式為:
SELECT * FROM `magazine` WHERE CONCAT(`title`,`tag`,`description`) LIKE ‘%關鍵字%’
歡迎大家關注我,我将不定期更新一些自己在背景開發中遇見的一些通用問題總結幫助大家一起進步。