2014-06-19 48 views
0

我有一張表。它共有兩列unique songgenre。獨特的歌曲存儲一個字符串,並不重要。將一個隨機大小的數組存儲在mySQL列中

流派包含一系列字符串(適用於歌曲的流派),字符串中元素的數量是隨機的(大到可以排列數組並僅增加一列)。

我知道這個設置在mySQL中不起作用,因爲我設置了它,但那正是我需要的。

做到這一點的一種方法是序列化,但我非常希望能夠查詢所有搖滾歌曲,而無需先查詢所有歌曲,反序列化,然後找到我的匹配。

由於所有的數組內容都是相同的類型,是否有列支持這種輸入? (int是一種有限數量的整數,不是嗎?)

+3

重新設計您的模式爲時已晚?將數組放在列中是非常糟糕的,您應該使用關係表。 – Barmar

+0

您可以使用'implode()'在列中存儲逗號分隔列表。當你想查詢列時,你可以使用'FIND_IN_SET()'來查看一個值是否在列表中。但是這很難合作,而且它使得複雜的查詢幾乎不可能。 – Barmar

+0

我可以使用額外的表格,但如果您仔細考慮,那也不會有效。問題是,在第一個表格中,每行可以有多個流派。如果我創作了一個流派表格,那麼我再次爲每個流派創作了多首歌曲,而我又回到了一開始。 – Karlovsky120

回答

3

你有多對多的關係 - 一首歌曲可以有多個流派,一個流派可以被多首歌曲使用。

創建一個名爲Song的表格,其中包含有關歌曲和某個唯一標識符的信息。爲了爭辯,我們只是說這是歌曲的名稱:s_name。

創建一個名爲Genre的表格,其中包含有關流派的信息。也許你有這種流派,還有一些關於它是什麼樣的音樂的信息。

最後,創建一個名爲SongAndGenre的表,它將充當橋表。它會有兩列 - 歌曲ID(在我們的例子中是s_name)和流派ID(比如g_name)。如果一首歌曲S有多個類型G1和G2,那麼這首歌曲就有兩行 - (S,G1)和(S,G2)。

+0

因此,第三張表就像是一個連接索引,我會尋找所有g_name,其中s_name是* somesong *,並且我們會將所有genreas連接到* somesong *。是的,那正是我正在尋找的。謝謝! – Karlovsky120

1

您現在有一張表,比如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之外的代碼中)。

相關問題