Mysql
 sql >> Database >  >> RDS >> Mysql

Ricerche multiple di ID MySQL

MySQL impossibile indicizzare le viste, quindi quello che vuoi è impossibile in MySQL .

Puoi utilizzare un motore di indicizzazione fulltext esterno come Sphinx e caricare i dati lì utilizzando una query con JOINS

In alternativa, puoi creare una tabella denormalizzata:

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

e riempilo con questa domanda:

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 

tempestivamente.

In realtà, se tutte le tue tabelle sono MyISAM , puoi applicare query di ricerca fulltext (in modalità booleana) a un join, senza dover creare un indice fulltext.

Ad esempio, se stai cercando '+Jones +math +physics' , dove Jones è il cognome di un insegnante e math e physics sono soggetti, puoi fare questa query:

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)

Il MATCH(teacherBiography) AGAINST ('+Jones') utilizzerà un FULLTEXT indice su teacher , se presente; il secondo MATCH filtrerà finemente i risultati.

Query che coinvolgono OR le condizioni o l'ordinamento per pertinenza sono più complessi, tuttavia.