虽然这个话题已被广泛讨论,但它让我非常困惑,我无法提炼出正确的答案。你能帮我正确的方向吗?感谢。
我有这样的设置:表page
通过参考表widget
连接到表widget_to_page
:
第(p)页
sid | title | content
小部件(w)
sid | content
widget_to_page(wtp)
sid | page_sid | widget_sid
我在p.title
,p.content
,w.content
接下来,我想看一下page-widget-combination:
SELECT *, MATCH(p.title, p.content, w.content) AGAINST("'.$keyword.'") AS score
FROM page p, widget w, widget_to_page wtp
WHERE MATCH(p.title, p.content, w.content) AGAINST("'.$keyword.'")
AND p.sid = wtp.page_sid
AND w.sid = wtp.widget_sid
ORDER BY score DESC
一些评论:
我尝试过的另一种方法是用以下语句创建一个MySQL视图:
SELECT *
FROM page p, widget w, widget_to_page wtp
WHERE p.sid = wtp.page_sid
AND w.sid = wtp.widget_sid
但这似乎也不起作用。有些人谈到在这个特定的视图上创建全文索引,但我在PHPMyAdmin中找不到任何选项来做这个,我不知道这是否可能。
简而言之......在这种情况下,最佳做法是什么?感谢。
答案 0 :(得分:3)
FULLTEXT索引可以包含多个列,但这些列必须位于同一个表中。因此,您将无法在单个索引中覆盖2个表中的3列。您将需要至少2个索引才能完成此任务。
此外,FULLTEXT索引仅适用于MyISAM存储引擎,因此如果您使用像InnoDB这样的事务引擎,则无法使用。您应该阅读手册以了解全文索引的其他功能和限制(包括布尔模式,停用词等):
http://dev.mysql.com/doc/refman/5.1/en/fulltext-search.html
假设您正在使用MyISAM,您可以在(p.title,p.content)上创建1个全文索引,在(w.content)上创建另一个全文索引,然后分别查询这两个索引并使用UNION ALL组合结果
生成的查询将是这样的,但您需要调整它以满足您的特定要求:
select page_sid, page_title, sum(score) as total_score
from
(
SELECT p.sid as page_sid,p.title as page_title,NULL as widget_sid,
MATCH(p.title, p.content) AGAINST("'.$keyword.'") AS score
FROM page p
WHERE MATCH(p.title, p.content) AGAINST("'.$keyword.'")
UNION
SELECT p.sid as page_sid,p.title as page_title,w.sid as widget_sid,
MATCH(w.content) AGAINST("'.$keyword.'") AS score
FROM page p
inner join widget_to_page wtp on p.sid = wtp.page_sid
inner join widget w on w.sid = wtp.widget_sid
WHERE MATCH(w.content) AGAINST("'.$keyword.'")
) as sub_query
group by page_sid
ORDER BY total_score DESC