Tengo tres tablas en una base de datos MySQL utilizados en una aplicación de biblioteca de música:MySQL búsqueda de palabras clave en varias tablas
La tabla Genre
tiene columnas:
id
title
(cadena)
La tabla Album
tiene columnas:
id
genre_id
(clave externa aGenre.id
)title
(cadena)artist
(cadena)
y la mesa Track
tiene columnas:
id
album_id
(clave externa aAlbum.id
)title
(cadena)
Cada Album
puede tener cualquier número de Tracks
, cada uno tiene Track
Album
, y cada uno tiene Album
Genre
.
Quiero poner en práctica una búsqueda por palabra clave que permite al usuario introducir cualquier número de palabras clave y encontrar toda Tracks
que:
- tener un
title
a juego, - están en un
Album
con una haciendo coincidirtitle
oartist
, - o están en un
Album
con unGenre
con untitle
correspondiente.
Los resultados deben ser ordenados por relevancia. Sería genial si cada campo tuviera una clasificación por relevancia. Por ejemplo, el title
de un Track
podría ser más importante que el title
del Genre
.
Además, la solución debe usar alguna forma de búsqueda parcial. Una búsqueda de rubber
primero debe coincidir con todos Tracks
con un title
de Rubber
, a continuación, coincide con un Tracks
title
juego *rubber*
(*
= comodín), a continuación, pasar a Albums
, y así sucesivamente. Sin embargo, no estoy tan concentrado en estos detalles. Solo busco una solución más general que pueda modificar para que coincida con mis necesidades específicas.
También debería mencionar que estoy usando una pila LAMP, Linux, Apache, MySQL y PHP.
¿Cuál es la mejor manera de poner en práctica esta búsqueda por palabra clave?
Actualización: que he estado tratando de aplicar esto a través de una búsqueda de texto completo, y han llegado con las siguientes sentencias SQL.
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');
¿Está buscando la coincidencia exacta o coincidencia parcial? –
Gracias por la respuesta, he agregado más información a la pregunta. –