0

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

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%'

我应该怎么做才能使这些逗号分隔的列表更适合这项工作。另外,请记住,有些行可能只有一个标签,因此根本没有逗号。谢谢。

4

3 回答 3

1

RLIKE与适当的正则表达式一起使用:

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

请参阅此条件的SQLFiddle 现场演示,该演示与问题中的示例输入一起正常工作。

于 2013-09-03T23:04:06.203 回答
1

不使用正则表达式:

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

查看演示

这里的解决方案是规范化您的表格。

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);
于 2013-09-03T23:09:39.267 回答
1
select * from Table1
where find_in_set('hunting',`text`) 
or find_in_set(' hunting',`text`)

样品小提琴

于 2013-09-04T04:15:58.063 回答