我担心这有点贵。
另外,我很快就会为标签实现标准化系统,因此会有额外的连接。
最重要的是,我有4个表(tbl_videos,tbl_articles,tbl_galleries和tbl_users),我想要显示每个表的三个结果,因此必须在一次按“搜索”时运行查询四次。
SELECT *,
(
(CASE WHEN `description` LIKE '%hotel%' THEN 1 ELSE 0 END) +
(CASE WHEN `description` LIKE '%london%' THEN 1 ELSE 0 END) +
(CASE WHEN `description` LIKE '%lazy%' THEN 1 ELSE 0 END) +
(CASE WHEN `description` LIKE '%dog%' THEN 1 ELSE 0 END) +
(CASE WHEN `title` LIKE '%hotel%' THEN 1 ELSE 0 END) +
(CASE WHEN `title` LIKE '%london%' THEN 1 ELSE 0 END) +
(CASE WHEN `title` LIKE '%lazy%' THEN 1 ELSE 0 END) +
(CASE WHEN `title` LIKE '%dog%' THEN 1 ELSE 0 END) +
(CASE WHEN `tags` LIKE '%hotel%' THEN 1 ELSE 0 END) +
(CASE WHEN `tags` LIKE '%london%' THEN 1 ELSE 0 END) +
(CASE WHEN `tags` LIKE '%lazy%' THEN 1 ELSE 0 END) +
(CASE WHEN `tags` LIKE '%dog%' THEN 1 ELSE 0 END)
) AS relevance
FROM `table`
WHERE `description` LIKE '%hotel%'
OR `description` LIKE '%london%'
OR `description` LIKE '%lazy%'
OR `description` LIKE '%dog%'
OR `title` LIKE '%hotel%'
OR `title` LIKE '%london%'
OR `title` LIKE '%lazy%'
OR `title` LIKE '%dog%'
OR `tags` LIKE '%hotel%'
OR `tags` LIKE '%london%'
OR `tags` LIKE '%lazy%'
OR `tags` LIKE '%dog%'
ORDER BY relevance DESC
LIMIT 0 , 3;
答案 0 :(得分:1)
是的,这可能会非常耗费资源,但听起来您在提交查询之前就有一个业务层。
考虑一下你想要实现什么,以及你自己可以做什么,在解析搜索术语方面,甚至为用户提供描述,标题和标签的单独字段,并适当地构建查询,以更直接地查询,而不是有效地说,“我有一些数据非常像这个搜索词,在这个表的列中的某个地方。”
一旦你确定了你的业务逻辑(如果上面的查询是如何结束的,虽然我怀疑它,然后sobeit),那么你应该通过解释计划运行查询,看看你可能会在哪里找到一些索引来帮助数据库。
编辑:
好的,这对于一个建议是怎么回事
select matched_val, relevance from (
select description as matched_val, count(*) as relevance
from table
where description like '%hotel%'
or description like '%london%'
or description like '%lazy%'
or description like '%dog%'
group by description
union all
select title as matched_val, count(*) as relevance
from table
where title like '%hotel%'
or title like '%london%'
or title like '%lazy%'
or title like '%dog%'
group by title
union all
select tags as matched_val, count(*) as relevance
from table
where tags like '%hotel%'
or tags like '%london%'
or tags like '%lazy%'
or tags like '%dog%'
group by tags
) as a
order by a.relevance desc
LIMIT 0 , 3
它至少意味着你只需要匹配一次,而不是在谓词和switch语句中,加上优化器就可以在描述,标题和标签上使用索引(你需要它添加自己)你应该离开。
快来看看你的查询优化器是怎么喜欢的......