2010-02-05 49 views
3

我有一个外地在我的桌子上的一些内容标签,用空格分隔,而且目前我使用的是:MySQL的选择就像

SELECT * FROM content WHERE tags LIKE '%$selectedtag%'" 

但如果选择的标签是大象 ,它将选择标记bigelephantelephantblah等内容...

我如何得到它只是选择我想要的精确?

回答

5
SELECT * FROM content WHERE tags RLIKE '[[:<:]]elephant[[:>:]]' 

如果你的表是MyISAM,您可以使用此:

SELECT * FROM content WHERE MATCH(tags) AGAINST ('+elephant' IN BOOLEAN MODE) 

,这可以通过创建一个FULLTEXT指数也大幅提高:

CREATE FULLTEXT INDEX ix_content_tags ON content (tags) 

,而是将工作即使没有索引。

为了达到这个目的,你应该调整@@ft_min_wold_len来索引少于4个字符长度的标签(如果有的话)。

+0

+1:这是正确的方法。 – 2010-02-05 16:54:51

+0

+1,但现在你有2个问题:) – 2010-02-05 16:56:15

+0

太好了,谢谢。这完美的工作(现在),但我肯定会在未来重组它,但是。 – 2010-02-05 17:17:41

0

我会在这里考虑一个不同的设计。这构成了多对多的关系,所以你可以有一个tags表和一个连接表。一般来说,数据的原子性可以让你免受许多麻烦。

这种方法的另一个好处是您可以重命名标签,而不必编辑包含该标签的每个条目。

-1

'%'是SQl中的通配符。删除通配符,你会得到正是你所要求的。

-1

重做表的设计,但现在,如果你使用的空间标签之间的分隔,你可以这样做:

SELECT * FROM content WHERE tags LIKE '% elephant %'; 

只要确保你领导和以空间结束,以及(或代替空格逗号,如果你这样做)

虽然,最好的选择是在你的数据库中建立一个多对多的关系,但我怀疑你正在寻找一个快速和肮脏的一次性修复。

0

答:你必须创建一个单独的标签表指向与内容识别的内容,并包含一个关键字,那么:

select a.* 
from content a,tags b 
where a.id=b.contentid 
group by a.id; 

B:把标签之间和befor和afther他们一个逗号,像",bigelephant,elephant,",然后用like "%,elephant,%"

0
WHERE tags LIKE '% '{$selectedtag}' %' 
     OR tags LIKE ''{$selectedtag}' %' 
     OR tags LIKE '% '{$selectedtag}'' 
1

你可以使用MySQL的正则表达式。

SELECT * FROM content WHERE tags REGEXP '(^|)selectedtag($|)' 

但请注意,使用正则表达式会增加开销,并且在某些情况下可能执行得不好。

另一种简单的方法,如果你可以改变你的数据库数据,就是确保在第一个标签之前和最后一个之后有一个空的空间;有点像:“大象动物”。这样你可以使用通配符。

SELECT * FROM content WHERE tags LIKE '% selectedtag %'