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ší.