MySQL
kan ikke indeksere visninger, så det du ønsker er umuligt i MySQL
.
Du kan bruge en ekstern fuldtekstindekseringsmotor som Sphinx og indlæse data der ved hjælp af en forespørgsel med JOINS
Alternativt kan du oprette en denormaliseret tabel:
CREATE TABLE ftsearch
(
teacherId INT PRIMARY KEY,
teacherBiography TEXT,
subject1 TEXT,
subject2 TEXT,
subject3 TEXT,
)
ENGINE=MyISAM
og udfyld den med denne forespørgsel:
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
rettidigt.
Faktisk, hvis alle dine tabeller er MyISAM
, kan du anvende fuldtekstsøgeforespørgsler (i boolesk tilstand) på en joinforbindelse uden at skulle oprette et fuldtekstindeks.
Sig, hvis du søger efter '+Jones +math +physics'
, hvor Jones
er en lærers efternavn og math
og physics
er emner, kan du udføre denne forespørgsel:
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')
vil bruge en FULLTEXT
indeks på teacher
, hvis nogen; den anden MATCH
vil finfiltrere resultaterne.
Forespørgsler, der involverer OR
betingelser eller relevanssortering er dog mere komplekse.