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.