MySQL
không thể lập chỉ mục các chế độ xem nên những gì bạn muốn là không thể trong MySQL
.
Bạn có thể sử dụng công cụ lập chỉ mục toàn văn bản bên ngoài như Sphinx và tải dữ liệu ở đó bằng cách sử dụng truy vấn với JOINS
Ngoài ra, bạn có thể tạo một bảng không chuẩn hóa:
CREATE TABLE ftsearch
(
teacherId INT PRIMARY KEY,
teacherBiography TEXT,
subject1 TEXT,
subject2 TEXT,
subject3 TEXT,
)
ENGINE=MyISAM
và điền vào nó với truy vấn sau:
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
trên cơ sở kịp thời.
Trên thực tế, nếu tất cả các bảng của bạn là MyISAM
, bạn có thể áp dụng các truy vấn tìm kiếm toàn văn bản (ở chế độ boolean) cho một phép nối mà không cần phải tạo chỉ mục toàn văn bản.
Giả sử, nếu bạn đang tìm kiếm '+Jones +math +physics'
, trong đó Jones
là họ của giáo viên và math
và physics
là chủ thể, bạn có thể thực hiện truy vấn này:
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')
sẽ sử dụng FULLTEXT
lập chỉ mục trên teacher
, nếu có; MATCH
thứ hai sẽ lọc các kết quả.
Các truy vấn liên quan đến OR
Tuy nhiên, việc sắp xếp các điều kiện hoặc mức độ liên quan phức tạp hơn.