Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Suche nach mehreren IDs

MySQL kann Ansichten nicht indizieren, also ist das, was Sie wollen, in MySQL unmöglich .

Sie können eine externe Volltext-Indizierungsmaschine wie Sphinx verwenden und dort Daten über eine Abfrage mit JOINS laden

Alternativ können Sie eine denormalisierte Tabelle erstellen:

CREATE TABLE ftsearch
        (
        teacherId INT PRIMARY KEY,
        teacherBiography TEXT,
        subject1 TEXT,
        subject2 TEXT,
        subject3 TEXT,
        )
ENGINE=MyISAM

und füllen Sie es mit dieser Abfrage:

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 

rechtzeitig.

Eigentlich, wenn alle Ihre Tabellen MyISAM sind können Sie Volltextsuchabfragen (im booleschen Modus) auf einen Join anwenden, ohne einen Volltextindex erstellen zu müssen.

Angenommen, Sie suchen nach '+Jones +math +physics' , wobei Jones ist der Nachname eines Lehrers und math und physics Themen sind, können Sie diese Abfrage durchführen:

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)

Der MATCH(teacherBiography) AGAINST ('+Jones') verwendet einen FULLTEXT Index auf teacher , wenn überhaupt; das zweite MATCH wird die Ergebnisse fein filtern.

Abfragen mit OR Bedingungen oder Sortierung nach Relevanz sind jedoch komplexer.