MySQL kan inte indexera vyer så det du vill ha är omöjligt i MySQL .
Du kan använda en extern fulltextindexeringsmotor som Sphinx och ladda data där med en fråga med JOINS
Alternativt kan du skapa en denormaliserad tabell:
CREATE TABLE ftsearch
(
teacherId INT PRIMARY KEY,
teacherBiography TEXT,
subject1 TEXT,
subject2 TEXT,
subject3 TEXT,
)
ENGINE=MyISAM
och fyll den med denna fråga:
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
i god tid.
Faktiskt, om alla dina tabeller är MyISAM , kan du använda fulltextsökfrågor (i booleskt läge) på en join, utan att behöva skapa ett fulltextindex.
Säg, om du söker efter '+Jones +math +physics' , där Jones är en lärares efternamn och math och physics är ämnen kan du göra den här frågan:
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') kommer att använda en FULLTEXT index på teacher , om någon; den andra MATCH kommer att finfiltrera resultaten.
Frågor som involverar OR villkor eller relevanssortering är dock mer komplexa.