您現在有一張表,比如songs
,其中包含一列genres
。
要知道的歌#123的風格,你現在可以發出
SELECT genres FROM songs WHERE id = 123;
你需要做的是創建兩個附加表:
CREATE TABLE genres (
genre_id integer not null primary key auto_increment,
genre_name varchar(75)
);
CREATE TABLE song_has_genre (
song_id integer not null,
genre_id integer not null
);
要存儲的事實,歌曲123在流派「民間」,「流行音樂」,「爵士」和「不管」,你可以運行:
INSERT INTO song_has_genre
SELECT 123, genre_id FROM genres
WHERE genre_name IN ('Folk', 'Pop', 'Jazz', ...);
要查詢什麼歌是我ñ流派民俗,更
SELECT songs.*, genres.genre_name FROM songs
JOIN song_has_genre AS shg ON (songs.id = shg.song_id)
JOIN genres ON (shg.genre_id = genres.genre_id)
WHERE genres.genre_name = 'Folk';
一些工作需要,以避免重複,如果你選擇了兩個流派和一首歌曲是在兩個或檢索基於流派的選擇一些歌曲的所有流派(即,你搜索「流行音樂','流行','流行','技術','流行','流行音樂,無論',例如使用GROUP_CONCAT
和/或GROUP BY
,或者在MySQL之外的代碼中)。
重新設計您的模式爲時已晚?將數組放在列中是非常糟糕的,您應該使用關係表。 – Barmar
您可以使用'implode()'在列中存儲逗號分隔列表。當你想查詢列時,你可以使用'FIND_IN_SET()'來查看一個值是否在列表中。但是這很難合作,而且它使得複雜的查詢幾乎不可能。 – Barmar
我可以使用額外的表格,但如果您仔細考慮,那也不會有效。問題是,在第一個表格中,每行可以有多個流派。如果我創作了一個流派表格,那麼我再次爲每個流派創作了多首歌曲,而我又回到了一開始。 – Karlovsky120