Tôi có ba bảng trong một cơ sở dữ liệu MySQL được sử dụng trong một ứng dụng thư viện âm nhạc:MySQL từ khóa tìm kiếm trên nhiều bảng
Bảng Genre
có các cột:
id
title
(string)
Bảng Album
có các cột:
id
genre_id
(chính nước ngoài đểGenre.id
)title
(chuỗi)artist
(chuỗi)
và Track
bảng có các cột:
id
album_id
(khoá ngoại đểAlbum.id
)title
(chuỗi)
Mỗi Album
có thể có bất kỳ số lượng Tracks
, mỗi Track
có một Album
, và mỗi Album
có một Genre
.
Tôi muốn thực hiện một tìm kiếm từ khóa đó cho phép người dùng nhập bất kỳ số lượng từ khóa và tìm thấy tất cả Tracks
rằng:
- có một phù hợp với
title
, - đang ở trên một
Album
với một khớp vớititle
hoặcartist
, - hoặc đang ở trên
Album
với mộtGenre
với một kết hợptitle
.
Kết quả phải được sắp xếp theo mức độ liên quan. Nó sẽ là tuyệt vời nếu mỗi lĩnh vực có một thứ hạng cho sự liên quan. Ví dụ: title
của một số Track
có thể quan trọng hơn số title
của số Genre
.
Ngoài ra, giải pháp nên sử dụng một số dạng tìm kiếm một phần. Một tìm kiếm của rubber
đầu tiên phải phù hợp với tất cả Tracks
với một title
của Rubber
, sau đó kết hợp với một Tracks
title
phù hợp với *rubber*
(*
= wildcard), sau đó chuyển sang Albums
, và vân vân. Tuy nhiên, tôi không đặt những chi tiết này. Tôi chỉ đang tìm một giải pháp tổng quát hơn mà tôi có thể tinh chỉnh để phù hợp với nhu cầu cụ thể của mình.
Tôi cũng nên đề cập rằng tôi đang sử dụng LAMP stack, Linux, Apache, MySQL và PHP.
Cách tốt nhất để triển khai tìm kiếm từ khóa này là gì?
Cập nhật: Tôi đã cố gắng để thực hiện điều này thông qua một tìm kiếm văn bản đầy đủ, và đã đưa ra các câu lệnh SQL sau.
CREATE TABLE `Genre` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`title` text NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
INSERT INTO `Genre` VALUES(1, 'Rock');
CREATE TABLE `Album` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`genre_id` int(11) NOT NULL,
`title` text NOT NULL,
`artist` text,
PRIMARY KEY (`id`),
FULLTEXT KEY (`title`, `artist`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
INSERT INTO `Album` VALUES(1, 1, 'Rubber Soul', 'The Beatles');
CREATE TABLE `Track` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`album_id` int(11) NOT NULL,
`title` text NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY (`title`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
INSERT INTO `Track` VALUES(1, 1, 'Drive My Car');
INSERT INTO `Track` VALUES(2, 1, 'What Goes On');
INSERT INTO `Track` VALUES(3, 1, 'Run For Your Life');
INSERT INTO `Track` VALUES(4, 1, 'Girl');
Bạn đang tìm kiếm kết hợp chính xác hoặc khớp một phần? –
Cảm ơn bạn đã trả lời, tôi đã thêm thông tin thêm vào câu hỏi. –