如何使用通配符(%)进行搜索但不包含空格?

时间:2013-09-03 22:48:46

标签: mysql sql find-in-set

我的数据库中的列中有逗号分隔标记列表。我使用一个简单的通配符来拉出与我正在搜索的标签匹配的项目。但是,我发现一些标签作为其他标签的标题的一部分包含在内,并且它们也被返回。例如,可能会返回搜索这些行的搜索:

hunting, fishing, outdoors <-- Should be returned
sporting goods, hunting    <-- Should be returned
bargain hunting, sale      <-- Should NOT be returned
bullets, guns, hunting     <-- Should be returned

目前我正在使用:

WHERE column LIKE '%hunting%'

如何使用这些逗号分隔列表更好地完成此工作,我该怎么做。另外,请记住,某些行可能只有一个标记,因此根本没有逗号。感谢。

3 个答案:

答案 0 :(得分:1)

RLIKE与相应的正则表达式一起使用:

WHERE column RLIKE '(^|, )hunting(,|$)'

使用问题的示例输入正确查看SQLFiddle live demo此条件是否正常工作。

答案 1 :(得分:1)

不使用正则表达式:

WHERE column LIKE '%, hunting' 
   OR column LIKE '%, hunting,%'
   OR column LIKE 'hunting, %'

See a demo

此处的解决方案是规范化您的表格。

CREATE TABLE products
    (`id` int, `name` varchar(4));

INSERT INTO products
    (`id`, `name`)
VALUES
    (1, 'gun'), 
    (2, 'fish');

CREATE TABLE keywords
    (`id` int, `keyword` varchar(15));

INSERT INTO keywords
    (`id`, `keyword`)
VALUES
    (1, 'hunting'),
    (2, 'fishing'),
    (3, 'outdoors'),
    (4, 'sporting goods'),
    (5, 'bargain hunting'),
    (6, 'sale'),
    (7, 'bullets'),
    (8, 'guns');


CREATE TABLE productKeywords
    (`productId` int, `keywordId` int);

INSERT INTO productKeywords
    (`productId`, `keywordId`)
VALUES
    (1, 1),
    (1, 3),
    (1, 4),
    (2, 2),
    (2, 5);

答案 2 :(得分:1)

select * from Table1
where find_in_set('hunting',`text`) 
or find_in_set(' hunting',`text`)

<强> SAMPLE FIDDLE