也许LIKE不是我想做的事情的正确解决方案;但我要实现的是采取从数据库检索字符串。(即标签[tag1,tag2,tag3,tag4]) -然后比较每个值(用逗号分隔)并相应地返回类似的行。
<?
$string = 'tag1,tag2,tag3,tag4';
$tags = explode(',', $string);
foreach ( $tags as $tag )
{
$this->db->limit(2); $this->db->like('Tags', $tag);
$result = $this->db->get('table');
$recommend[] = $result;
}
这是我能理解如何做我正在寻找的最好的,但我对CI的活动记录类的一般LIKE方法很困惑。
在数据库中对分隔字符串执行搜索甚至真的完全明智吗?
谢谢你的意见和想法。MySQL有点超出我的理解范围,但是在阅读了关系数据库的一些可能的事情之后;我将尝试学习这个过程,以便更有效地构建我的数据库。
我的数据库将是一个视频游戏和文件的目录,所以很明显,这意味着它将达到疯狂数量的条目-所以试图通过任何类型的字符串查找可能返回的行将是迄今为止我能做的最愚蠢的事情,从长远来看。
再次感谢你的信息和想法。如果您有一个适当规范化的数据库,则应该将标记拆分为一个新表,因为这是一对多(甚至可能是多对多)关系。
然而,实现这一点的最简单方法是在第一个标签之前和最后一个标签之后加上逗号,然后简单地搜索:SELECT * FROM table WHERE Tags LIKE "%,coleslaw,%";
MySQL中有一个FIELD
命令,您可能能够利用它。你可以在这里阅读。
但是一般来说,在数据库中对分隔字符串或子字符串执行搜索会降低性能,因为在子字符串上匹配时会丢失任何索引。如果有1000行,MySQL必须扫描所有1000行才能发现没有匹配。这适用于出现在where子句中的Like
和Substring
。许多数据库实现专门提供了一个仍然可以利用索引的BEGINS WITH
操作符,但我不知道在MySQL中有这个。
可以考虑在插入时将字符串分解,并将每个单词单独存储在不同的表中。如果你发现你经常这样做,考虑一个为文本搜索而构建的引擎,比如Lucene。你可以通过SOLR使用PHP和Lucene。虽然我把它扔在那里,但对于您的项目来说,它可能完全是多余的。
我知道这可能不是你想听到的,但你的直觉是对的。