J'ai trois tables dans une base de données MySQL utilisés dans une application de bibliothèque musicale:MySQL Recherche par mot clé À travers plusieurs tables
Le tableau Genre
a colonnes:
id
title
(string)
La table Album
comporte des colonnes:
id
genre_id
(clé étrangère àGenre.id
)title
(string)artist
(string)
et la table Track
a colonnes:
id
album_id
(clé étrangère àAlbum.id
)title
(string)
Chaque Album
peut avoir un certain nombre de Tracks
, chaque Track
a un Album
, et chaque Album
a un Genre
.
Je veux mettre en œuvre une recherche par mot clé qui permet à l'utilisateur d'entrer un certain nombre de mots-clés et trouver tous Tracks
que:
- ont un
title
correspondant, - sont sur un
Album
avec correspondant àtitle
ouartist
, - ou sont sur un
Album
avec unGenre
avec un correspondanttitle
.
Les résultats doivent être triés par pertinence. Ce serait génial si chaque domaine avait un classement pour la pertinence. Par exemple, le title
d'un Track
pourrait être plus important que le title
du Genre
.
En outre, la solution doit utiliser une certaine forme de recherche partielle. Une recherche de rubber
doit d'abord correspondre à tous les Tracks
avec un title
de Rubber
, puis correspondre Tracks
avec un title
correspondant *rubber*
(*
= joker), puis passer à Albums
, et ainsi de suite. Cependant, je ne suis pas tellement sur ces détails. Je suis à la recherche d'une solution plus générale que je peux ajuster pour répondre à mes besoins spécifiques.
Je devrais aussi mentionner que j'utilise une pile LAMP, Linux, Apache, MySQL et PHP.
Quelle est la meilleure façon de mettre en œuvre cette recherche par mot clé?
Mise à jour: J'ai essayé de mettre en œuvre ce via une recherche en texte intégral, et je suis venu avec les instructions SQL suivantes.
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');
Vous recherchez une correspondance exacte ou une correspondance partielle? –
Merci pour la réponse, j'ai ajouté plus d'informations à la question. –