MySQL
no puede indexar vistas, por lo que lo que desea es imposible en MySQL
.
Puede usar un motor de indexación de texto completo externo como Sphinx y cargar datos allí usando una consulta con JOINS
Alternativamente, puede crear una tabla desnormalizada:
CREATE TABLE ftsearch
(
teacherId INT PRIMARY KEY,
teacherBiography TEXT,
subject1 TEXT,
subject2 TEXT,
subject3 TEXT,
)
ENGINE=MyISAM
y rellénelo con 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
oportunamente.
En realidad, si todas sus tablas son MyISAM
, puede aplicar consultas de búsqueda de texto completo (en modo booleano) a una combinación, sin tener que crear un índice de texto completo.
Diga, si está buscando '+Jones +math +physics'
, donde Jones
es el apellido de un profesor y math
y physics
son temas, puedes hacer 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)
El MATCH(teacherBiography) AGAINST ('+Jones')
utilizará un FULLTEXT
índice en teacher
, Si alguna; el segundo MATCH
filtrará finamente los resultados.
Consultas relacionadas con OR
Sin embargo, las condiciones o la clasificación por relevancia son más complejas.