在實(shí)際開(kāi)發(fā)中,我們經(jīng)常會(huì)遇到存儲(chǔ)逗號(hào)分隔數(shù)據(jù)的情況,如用戶(hù)的標(biāo)簽、商品的分類(lèi)等。這時(shí)候如何高效地查詢(xún)這些數(shù)據(jù)就成了一個(gè)問(wèn)題。
一般來(lái)說(shuō),我們可以使用MySQL中的FIND_IN_SET函數(shù)來(lái)實(shí)現(xiàn)逗號(hào)分隔數(shù)據(jù)的查詢(xún)。具體方法如下:
1. 創(chuàng)建測(cè)試表并插入數(shù)據(jù)
CREATE TABLE test (
id INT(11) NOT NULL AUTO_INCREMENT,
tags VARCHAR(255) NOT NULL,
PRIMARY KEY (id)noDBb4;
INSERT INTO test (tags) VALUES
('tag1,tag2,tag3'),
('tag2,tag3,tag4'),
('tag3,tag4,tag5'),
('tag4,tag5,tag6'),
('tag5,tag6,tag7');
2. 查詢(xún)包含tag3的記錄
SELECT * FROM test WHERE FIND_IN_SET('tag3', tags) >0;
結(jié)果如下:
+----+--------------+
id | tags
+----+--------------+
1 | tag1,tag2,tag3
2 | tag2,tag3,tag4
3 | tag3,tag4,tag5
+----+--------------+
3. 查詢(xún)不包含tag3的記錄
SELECT * FROM test WHERE FIND_IN_SET('tag3', tags) = 0;
結(jié)果如下:
+----+--------------+
id | tags
+----+--------------+
4 | tag4,tag5,tag6
5 | tag5,tag6,tag7
+----+--------------+
需要注意的是,使用逗號(hào)分隔數(shù)據(jù)的查詢(xún)會(huì)導(dǎo)致全表掃描,對(duì)于大表來(lái)說(shuō)查詢(xún)性能會(huì)比較差。因此,在實(shí)際開(kāi)發(fā)中,建議盡量避免使用逗號(hào)分隔數(shù)據(jù),而是將數(shù)據(jù)拆分成獨(dú)立的字段或使用關(guān)聯(lián)表來(lái)存儲(chǔ)。