我有一个包含关键字列表的数组
$arr = array('london','england','football',...);
该数组可以有N th 关键字。
我需要在sql查询中使用它,但我不想做这么多的重复。
select * from t1 where title LIKE('%$arr[0]%') OR title LIKE('%$arr[1]%') [...]
只需要一个更好的解决方案,因为每个关键字都会过滤掉记录。
日Thnx
答案 0 :(得分:1)
一种解决方案是创建一个查找表,每当创建或更改行时,该表都会使用rowid和keywordid填充。
然后你可以跳过所有的LIKE并获得更多的表现。
插入和更新的触发器应该可以工作,但插入和更新会花费更多的性能。
您只需使用
SELECT * FROM t1 WHERE id in (SELECT id FROM lookup WHERE keywordid IN ())
如果关键字很多,您可以使用更多的子查询来获取关键字ID,或者更少使用直接在代码,字典或同样中使用缓存查找结构。
答案 1 :(得分:1)
答案 2 :(得分:0)
我不确定您是想优化实际查询本身还是要在查询中插入关键字的方法。 如果是后者,那么很快就会想到的是:
$query = "SELECT * FROM t1 WHERE title";
foreach($arr as $keyword)
{
$stack[] = " LIKE '%$keyword%' ";
}
$query .= implode(' OR title ', $stack);
如果您想避免基于关键字的全表扫描,那么本身需要一个不同的主题,并在最后提供更多解释。
答案 3 :(得分:0)