MySQL Select Like

时间:2010-02-05 16:46:45

标签: mysql sql sql-like

我的表格中有一个字段用于标记某些内容,以空格分隔,目前我正在使用:

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

但如果所选标签为 elephant ,则会选择标有 bigelephant elephantblah 等内容...

如何让它只是选择我想要的东西?

7 个答案:

答案 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 %';

只要确保你带领并以空格结束(或者用逗号替换空格,如果你这样做的话)

同样,最好的选择是在您的数据库中建立多对多关系,但我怀疑您正在寻找快速而肮脏的一次性修复。