MySQL impossibile indicizzare le viste, quindi quello che vuoi è impossibile in MySQL .
Puoi utilizzare un motore di indicizzazione fulltext esterno come Sphinx e caricare i dati lì utilizzando una query con JOINS
In alternativa, puoi creare una tabella denormalizzata:
CREATE TABLE ftsearch
(
teacherId INT PRIMARY KEY,
teacherBiography TEXT,
subject1 TEXT,
subject2 TEXT,
subject3 TEXT,
)
ENGINE=MyISAM
e riempilo con questa domanda:
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
tempestivamente.
In realtà, se tutte le tue tabelle sono MyISAM , puoi applicare query di ricerca fulltext (in modalità booleana) a un join, senza dover creare un indice fulltext.
Ad esempio, se stai cercando '+Jones +math +physics' , dove Jones è il cognome di un insegnante e math e physics sono soggetti, puoi fare questa query:
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)
Il MATCH(teacherBiography) AGAINST ('+Jones') utilizzerà un FULLTEXT indice su teacher , se presente; il secondo MATCH filtrerà finemente i risultati.
Query che coinvolgono OR le condizioni o l'ordinamento per pertinenza sono più complessi, tuttavia.