我的表格中有一个字段用于标记某些内容,用空格分隔,目前我正在使用:
SELECT * FROM content WHERE tags LIKE '%$selectedtag%'"
但是如果选择的标签是大象,它会选择带有bigelephant和egtleblah等标签的内容......
我怎样才能让它精确地选择我想要的东西?
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 个字符(如果有的话)。
您可以使用 MySQL 的正则表达式。
SELECT * FROM content WHERE tags REGEXP '(^| )selectedtag($| )'
但请注意,使用正则表达式会增加开销,并且在某些情况下可能表现不佳。
如果您可以更改数据库数据,另一种简单的方法是确保在第一个标记之前和最后一个标记之后有一个空格;有点像:“大象动物”。这样你就可以使用通配符。
SELECT * FROM content WHERE tags LIKE '% selectedtag %'
我会在这里考虑不同的设计。这构成了多对多关系,因此您可以有一个tags
表和一个连接表。一般来说,数据的原子性可以让你免于很多麻烦。
这种方法的另一个好处是您可以重命名标签,而无需编辑包含该标签的每个条目。
答:您必须创建一个单独的标签表,该表指向具有 contentid 的内容并包含关键字,然后:
select a.*
from content a,tags b
where a.id=b.contentid
group by a.id;
B:在标签之间加上逗号,之前和之后,比如",bigelephant,elephant,"
,然后使用like "%,elephant,%"
WHERE tags LIKE '% '{$selectedtag}' %'
OR tags LIKE ''{$selectedtag}' %'
OR tags LIKE '% '{$selectedtag}''
'%' 是 SQL 中的通配符。删除通配符,您将得到您所要求的准确信息。
重做表格设计,但现在如果你使用空格来分隔标签,你可以这样做:
SELECT * FROM content WHERE tags LIKE '% elephant %';
只需确保您也以空格开头和结尾(如果您这样做,则用逗号替换空格)
同样,最好的选择是在您的数据库中建立多对多关系,但我怀疑您正在寻找一种快速而肮脏的一次性修复。