MySQL
tidak dapat mengindeks tampilan sehingga yang Anda inginkan tidak mungkin di MySQL
.
Anda dapat menggunakan mesin pengindeksan teks lengkap eksternal seperti Sphinx dan memuat data di sana menggunakan kueri dengan JOINS
Atau, Anda dapat membuat tabel denormalisasi:
CREATE TABLE ftsearch
(
teacherId INT PRIMARY KEY,
teacherBiography TEXT,
subject1 TEXT,
subject2 TEXT,
subject3 TEXT,
)
ENGINE=MyISAM
dan isi dengan query ini:
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
tepat waktu.
Sebenarnya, jika semua tabel Anda adalah MyISAM
, Anda dapat menerapkan kueri penelusuran teks lengkap (dalam mode boolean) ke gabungan, tanpa harus membuat indeks teks lengkap.
Katakanlah, jika Anda mencari '+Jones +math +physics'
, di mana Jones
adalah nama belakang guru dan math
dan physics
adalah subjek, Anda dapat melakukan kueri ini:
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')
akan menggunakan FULLTEXT
indeks pada teacher
, jika ada; MATCH
kedua akan menyaring hasil dengan baik.
Kueri yang melibatkan OR
kondisi atau penyortiran relevansi lebih kompleks.