Mysql
 sql >> Base de données >  >> RDS >> Mysql

Recherches d'ID multiples MySQL

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.