Ho tre tabelle di un database MySQL utilizzati in un'applicazione di libreria musicale:MySQL Parole chiave di ricerca in più tabelle
La tabella Genre
ha colonne:
id
title
(stringa)
La tabella Album
ha colonne:
id
genre_id
(chiave esternaGenre.id
)title
(stringa)artist
(stringa)
e la tabella Track
comprende colonne:
id
album_id
(chiave esternaAlbum.id
)title
(stringa)
Ogni Album
può avere qualsiasi numero di Tracks
, ciascuna Track
ha un Album
, e ciascuno ha una Album
Genre
.
Voglio realizzare una ricerca parola chiave che permette all'utente di inserire qualsiasi numero di parole chiave e trovare tutti Tracks
che:
- hanno una corrispondenza
title
, - sono su un
Album
con un corrispondenti atitle
oartist
, - o su un
Album
con unGenre
con un valore di corrispondenzatitle
.
I risultati devono essere ordinati per pertinenza. Sarebbe bello se ogni campo avesse una classifica per rilevanza. Ad esempio, lo title
di un Track
potrebbe essere più importante dello title
dello Genre
.
Inoltre, la soluzione dovrebbe utilizzare una qualche forma di ricerca parziale. Una ricerca di rubber
dovrebbe prima partita tutto Tracks
con una title
di Rubber
, poi abbinare Tracks
con un title
corrispondenza *rubber*
(*
= wildcard), per poi passare a Albums
, e così via. Tuttavia, non sono così determinato su questi dettagli. Sto solo cercando una soluzione più generale che possa essere modificata per soddisfare le mie esigenze specifiche.
Devo anche menzionare che sto usando uno stack LAMP, Linux, Apache, MySQL e PHP.
Qual è il modo migliore per attuare questa ricerca di parole chiave?
Aggiornamento: Ho cercato di attuare questa tramite una ricerca full text, e sono venuto su con le seguenti istruzioni 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');
Stai cercando corrispondenza esatta o corrispondenza parziale? –
Grazie per la risposta, ho aggiunto più informazioni alla domanda. –