MySQL
nie można indeksować widoków, więc to, czego chcesz, jest niemożliwe w MySQL
.
Możesz użyć zewnętrznego silnika indeksowania pełnotekstowego, takiego jak Sphinx, i załadować tam dane za pomocą zapytania z JOINS
Alternatywnie możesz utworzyć zdenormalizowaną tabelę:
CREATE TABLE ftsearch
(
teacherId INT PRIMARY KEY,
teacherBiography TEXT,
subject1 TEXT,
subject2 TEXT,
subject3 TEXT,
)
ENGINE=MyISAM
i wypełnij je tym zapytaniem:
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
terminowo.
Właściwie, jeśli wszystkie twoje tabele to MyISAM
, możesz zastosować zapytania wyszukiwania pełnotekstowego (w trybie logicznym) do złączenia, bez konieczności tworzenia indeksu pełnotekstowego.
Powiedz, jeśli szukasz '+Jones +math +physics'
, gdzie Jones
to nazwisko nauczyciela i math
i physics
to tematy, możesz wykonać to zapytanie:
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')
użyje FULLTEXT
indeks na teacher
, Jeśli w ogóle; drugi MATCH
dokładnie przefiltruje wyniki.
Zapytania zawierające OR
jednak warunki lub sortowanie według trafności są bardziej złożone.