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.