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

MySQL flere id-opslag

MySQL kan ikke indeksere visninger, så det du ønsker er umuligt i MySQL .

Du kan bruge en ekstern fuldtekstindekseringsmotor som Sphinx og indlæse data der ved hjælp af en forespørgsel med JOINS

Alternativt kan du oprette en denormaliseret tabel:

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

og udfyld den med denne forespørgsel:

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

rettidigt.

Faktisk, hvis alle dine tabeller er MyISAM , kan du anvende fuldtekstsøgeforespørgsler (i boolesk tilstand) på en joinforbindelse uden at skulle oprette et fuldtekstindeks.

Sig, hvis du søger efter '+Jones +math +physics' , hvor Jones er en lærers efternavn og math og physics er emner, kan du udføre denne forespørgsel:

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') vil bruge en FULLTEXT indeks på teacher , hvis nogen; den anden MATCH vil finfiltrere resultaterne.

Forespørgsler, der involverer OR betingelser eller relevanssortering er dog mere komplekse.




  1. visning af alle poster fra én tabel og matchende poster fra en anden

  2. Hentning af hierarkidata fra selvrefererende tabeller

  3. Hvor gemmer PostgreSQL databasen?

  4. For mange forbindelser Hibernate og mysql