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