2010-10-05 62 views
3

我试图将全文搜索添加到系统。我想写的查询需要涉及多次查找,然后进行搜索(如果甚至可能的话)。MySQL多个Id查找

我有一张老师桌和一张桌子。

teacherProfile 
teacherId [int] - primary key 
subjectOneId [int] 
subjectTwoId [int] 
subjectThreeId [int] 
teacherBiography [text] 

subjects 
subjectId [int] 
subjectName [text] 

所以,最后我想要的线沿线的一个结果..

teacherId [int] 
teacherBiography [text] 
(subjectOneName [text]) 
(subjectTwoName [text]) 
(subjectThreeName [text]) 

所以括号里的最后三个字段是不存在的,但我确实想对他们进行文本搜索,做我需要设置一个foriegn密钥约束(如果对现有系统有进一步的影响,我宁愿不要这么做),还是我能做些更有说服力的事情?

回答

2

MySQL无法索引视图,所以你想要的是不可能在MySQL

您可以使用那里查询中使用JOINS

或者像狮身人面像和加载数据的外部全文索引引擎,你可以创建一个非规范化的表:

CREATE TABLE ftsearch 
     (
     teacherId INT PRIMARY KEY, 
     teacherBiography TEXT, 
     subject1 TEXT, 
     subject2 TEXT, 
     subject3 TEXT, 
     ) 
ENGINE=MyISAM 

,并与此查询填满它:

INSERT 
INTO ftsearch 
SELECT teacherId, teacherBiography, 
     s1.name, s2.name, s3.name 
FROM teacherProfile 
LEFT JOIN 
     subject s1 
ON  s1.id = subjectOneId 
LEFT JOIN 
     subject s2 
ON  s2.id = subjectTwoId 
LEFT JOIN 
     subject s3 
ON  s3.id = subjectThreeId 

及时。实际上,如果您的所有表格都是MyISAM,则可以将全文搜索查询(以布尔模式)应用于连接,而不必创建全文索引。

说,如果你正在寻找'+Jones +math +physics',其中Jones是老师的姓氏和mathphysics是主体,你可以做到这一点查询:

SELECT teacherId, teacherBiography, 
     s1.name, s2.name, s3.name 
FROM teacherProfile 
LEFT JOIN 
     subject s1 
ON  s1.id = subjectOneId 
LEFT JOIN 
     subject s2 
ON  s2.id = subjectTwoId 
LEFT JOIN 
     subject s3 
ON  s3.id = subjectThreeId 
WHERE MATCH(teacherBiography) AGAINST ('+Jones' IN BOOLEAN MODE) 
     AND MATCH(t.teacherBiography, s1.name, s2.name, s3.name) AGAINST ('+Jones +math +physics' IN BOOLEAN MODE) 

MATCH(teacherBiography) AGAINST ('+Jones')将使用FULLTEXT指数teacher,如果任何;第二个MATCH将精细过滤结果。

然而,涉及OR条件或相关性排序的查询更复杂。

+0

辉煌,感谢Quassnoi为您的出色反应。 – 2010-10-05 16:09:04

+0

其实,如果我跳过全文搜索,如果没有最后三个字段的存在,我该如何进行查找?即获取视图的结果并对生物执行全文搜索? – 2010-10-05 16:10:35

+0

@ Julian:查找什么? – Quassnoi 2010-10-05 16:11:15