我有一个外地在我的桌子上的一些内容标签,用空格分隔,而且目前我使用的是:MySQL的选择就像
SELECT * FROM content WHERE tags LIKE '%$selectedtag%'"
但如果选择的标签是大象 ,它将选择标记bigelephant和elephantblah等内容...
我如何得到它只是选择我想要的精确?
我有一个外地在我的桌子上的一些内容标签,用空格分隔,而且目前我使用的是:MySQL的选择就像
SELECT * FROM content WHERE tags LIKE '%$selectedtag%'"
但如果选择的标签是大象 ,它将选择标记bigelephant和elephantblah等内容...
我如何得到它只是选择我想要的精确?
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个字符长度的标签(如果有的话)。
我会在这里考虑一个不同的设计。这构成了多对多的关系,所以你可以有一个tags
表和一个连接表。一般来说,数据的原子性可以让你免受许多麻烦。
这种方法的另一个好处是您可以重命名标签,而不必编辑包含该标签的每个条目。
'%'是SQl中的通配符。删除通配符,你会得到正是你所要求的。
重做表的设计,但现在,如果你使用的空间标签之间的分隔,你可以这样做:
SELECT * FROM content WHERE tags LIKE '% elephant %';
只要确保你领导和以空间结束,以及(或代替空格逗号,如果你这样做)
虽然,最好的选择是在你的数据库中建立一个多对多的关系,但我怀疑你正在寻找一个快速和肮脏的一次性修复。
答:你必须创建一个单独的标签表指向与内容识别的内容,并包含一个关键字,那么:
select a.*
from content a,tags b
where a.id=b.contentid
group by a.id;
B:把标签之间和befor和afther他们一个逗号,像",bigelephant,elephant,"
,然后用like "%,elephant,%"
WHERE tags LIKE '% '{$selectedtag}' %'
OR tags LIKE ''{$selectedtag}' %'
OR tags LIKE '% '{$selectedtag}''
你可以使用MySQL的正则表达式。
SELECT * FROM content WHERE tags REGEXP '(^|)selectedtag($|)'
但请注意,使用正则表达式会增加开销,并且在某些情况下可能执行得不好。
另一种简单的方法,如果你可以改变你的数据库数据,就是确保在第一个标签之前和最后一个之后有一个空的空间;有点像:“大象动物”。这样你可以使用通配符。
SELECT * FROM content WHERE tags LIKE '% selectedtag %'
+1:这是正确的方法。 – 2010-02-05 16:54:51
+1,但现在你有2个问题:) – 2010-02-05 16:56:15
太好了,谢谢。这完美的工作(现在),但我肯定会在未来重组它,但是。 – 2010-02-05 17:17:41