MySQL
não pode indexar visualizações, então o que você quer é impossível em MySQL
. Você pode usar um mecanismo de indexação de texto completo externo como Sphinx e carregar dados lá usando uma consulta com
JOINS
Alternativamente, você pode criar uma tabela desnormalizada:
CREATE TABLE ftsearch
(
teacherId INT PRIMARY KEY,
teacherBiography TEXT,
subject1 TEXT,
subject2 TEXT,
subject3 TEXT,
)
ENGINE=MyISAM
e preenchê-lo com esta consulta:
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
em tempo hábil.
Na verdade, se todas as suas tabelas forem
MyISAM
, você pode aplicar consultas de pesquisa de texto completo (no modo booleano) a uma junção, sem precisar criar um índice de texto completo. Digamos, se você estiver procurando por
'+Jones +math +physics'
, onde Jones
é o sobrenome de um professor e math
e physics
são assuntos, você pode fazer esta consulta: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)
O
MATCH(teacherBiography) AGAINST ('+Jones')
usará um FULLTEXT
índice em teacher
, caso existam; o segundo MATCH
filtrará com precisão os resultados. Consultas envolvendo o
OR
as condições ou classificação por relevância são mais complexas, no entanto.