2010-10-05 65 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