sql >> Databasteknik >  >> RDS >> Mysql

MySQL flera ID-sökningar

MySQL kan inte indexera vyer så det du vill ha är omöjligt i MySQL .

Du kan använda en extern fulltextindexeringsmotor som Sphinx och ladda data där med en fråga med JOINS

Alternativt kan du skapa en denormaliserad tabell:

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

och fyll den med denna fråga:

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 

i god tid.

Faktiskt, om alla dina tabeller är MyISAM , kan du använda fulltextsökfrågor (i booleskt läge) på en join, utan att behöva skapa ett fulltextindex.

Säg, om du söker efter '+Jones +math +physics' , där Jones är en lärares efternamn och math och physics är ämnen kan du göra den här frågan:

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)

MATCH(teacherBiography) AGAINST ('+Jones') kommer att använda en FULLTEXT index på teacher , om någon; den andra MATCH kommer att finfiltrera resultaten.

Frågor som involverar OR villkor eller relevanssortering är dock mer komplexa.




  1. Hur formaterar man bara de poster för vilka ORA-01843 inte kastas?

  2. Hur kommer det sig att smart sökning går så snabbt på facebook

  3. HQL / JPA hittar tillgängliga artiklar mellan datumintervall

  4. Hur tar man reda på fragmenterade index och defragmenterar dem i PostgreSQL?