Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Múltiplas pesquisas de ID do MySQL


MySQL não pode indexar visualizações, então o que você quer é impossível em MySQL .

Você pode usar um mecanismo de indexação de texto completo externo como Sphinx e carregar dados lá usando uma consulta com JOINS

Alternativamente, você pode criar uma tabela desnormalizada:
CREATE TABLE ftsearch
        (
        teacherId INT PRIMARY KEY,
        teacherBiography TEXT,
        subject1 TEXT,
        subject2 TEXT,
        subject3 TEXT,
        )
ENGINE=MyISAM

e preenchê-lo com esta consulta:
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 

em tempo hábil.

Na verdade, se todas as suas tabelas forem MyISAM , você pode aplicar consultas de pesquisa de texto completo (no modo booleano) a uma junção, sem precisar criar um índice de texto completo.

Digamos, se você estiver procurando por '+Jones +math +physics' , onde Jones é o sobrenome de um professor e math e physics são assuntos, você pode fazer esta consulta:
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)

O MATCH(teacherBiography) AGAINST ('+Jones') usará um FULLTEXT índice em teacher , caso existam; o segundo MATCH filtrará com precisão os resultados.

Consultas envolvendo o OR as condições ou classificação por relevância são mais complexas, no entanto.