MySQL nemůže indexovat pohledy, takže to, co chcete, je v MySQL nemožné .
Můžete použít externí fulltextový indexovací stroj jako Sphinx a načíst tam data pomocí dotazu s JOINS
Případně můžete vytvořit denormalizovanou tabulku:
CREATE TABLE ftsearch
(
teacherId INT PRIMARY KEY,
teacherBiography TEXT,
subject1 TEXT,
subject2 TEXT,
subject3 TEXT,
)
ENGINE=MyISAM
a vyplňte jej tímto dotazem:
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
včas.
Vlastně, pokud jsou všechny vaše tabulky MyISAM , můžete na spojení použít fulltextové vyhledávací dotazy (v booleovském režimu), aniž byste museli vytvářet fulltextový index.
Řekněme, že hledáte '+Jones +math +physics' , kde Jones je příjmení učitele a math a physics jsou předměty, můžete provést tento dotaz:
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') použije FULLTEXT index na teacher , jestli nějaký; druhý MATCH bude výsledky jemně filtrovat.
Dotazy zahrnující OR podmínky nebo třídění podle relevance jsou však složitější.