sql >> Base de Datos >  >> RDS >> Mysql

Búsquedas múltiples de ID de MySQL

MySQL no puede indexar vistas, por lo que lo que desea es imposible en MySQL .

Puede usar un motor de indexación de texto completo externo como Sphinx y cargar datos allí usando una consulta con JOINS

Alternativamente, puede crear una tabla desnormalizada:

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

y rellénelo con 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 

oportunamente.

En realidad, si todas sus tablas son MyISAM , puede aplicar consultas de búsqueda de texto completo (en modo booleano) a una combinación, sin tener que crear un índice de texto completo.

Diga, si está buscando '+Jones +math +physics' , donde Jones es el apellido de un profesor y math y physics son temas, puedes hacer 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)

El MATCH(teacherBiography) AGAINST ('+Jones') utilizará un FULLTEXT índice en teacher , Si alguna; el segundo MATCH filtrará finamente los resultados.

Consultas relacionadas con OR Sin embargo, las condiciones o la clasificación por relevancia son más complejas.