MySQL
ne peut pas indexer les vues donc ce que vous voulez est impossible dans MySQL
.
Vous pouvez utiliser un moteur d'indexation de texte intégral externe comme Sphinx et y charger des données à l'aide d'une requête avec JOINS
Vous pouvez également créer une table dénormalisée :
CREATE TABLE ftsearch
(
teacherId INT PRIMARY KEY,
teacherBiography TEXT,
subject1 TEXT,
subject2 TEXT,
subject3 TEXT,
)
ENGINE=MyISAM
et remplissez-le avec cette requête :
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
en temps opportun.
En fait, si toutes vos tables sont MyISAM
, vous pouvez appliquer des requêtes de recherche de texte intégral (en mode booléen) à une jointure, sans avoir à créer d'index de texte intégral.
Dites, si vous recherchez '+Jones +math +physics'
, où Jones
est le nom de famille d'un enseignant et math
et physics
sont des sujets, vous pouvez faire cette requête :
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)
Le MATCH(teacherBiography) AGAINST ('+Jones')
utilisera un FULLTEXT
index sur teacher
, si seulement; le deuxième MATCH
filtrera finement les résultats.
Requêtes impliquant le OR
les conditions ou le tri par pertinence sont cependant plus complexes.