在mySQL列中存储随机大小的数组

时间:2014-06-19 23:38:47

标签: php mysql

我有一张桌子。它包含两列unique songgenre。独特的歌曲存储一个字符串,并不重要。

Genres包含一个字符串数组(适用于该歌曲的类型),字符串中的元素数量是随机的(大到抛弃数组,只是制作其他列)。

我知道这个设置在我设置它时在mySQL中不起作用,但这就是我需要的。

这样做的一种方法是序列化,但我非常希望能够查询所有摇滚歌曲,而无需先查询所有摇滚歌曲,反序列化然后找到我的匹配。

由于所有数组内容属于同一类型,是否有一列支持这样的输入? (int是一种有限数量的int,不是吗?)

2 个答案:

答案 0 :(得分:3)

你有多对多的关系 - 一首歌可以有多种类型,多种歌曲可以使用一种类型。

创建一个名为Song的表,其中包含有关歌曲和一些唯一标识符的信息。为了论证,我们只是说它是歌曲的名称:s_name。

创建一个名为Genre的表,其中包含有关流派的信息。也许你有这种类型,以及有关什么样的音乐风格的一些信息。

最后,创建一个名为SongAndGenre的表,它将充当桥表。它有两列 - 一首歌曲ID(在我们的例子中是s_name)和一个流派ID(比方说,g_name)。如果歌曲S具有多个流派G1和G2,则该歌曲有两行 - (S,G1)和(S,G2)。

答案 1 :(得分:1)

您现在有一个表格{}包含songs {。}}。

要了解歌曲#123的类型,您现在可以发出

genres

您需要做的是创建另外两个表:

SELECT genres FROM songs WHERE id = 123;

为了存储歌曲123属于'Folk','Pop','Jazz'和'Whatever'类型的事实,你可以运行:

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
);

查询民族歌曲中的哪些歌曲,

INSERT INTO song_has_genre
    SELECT 123, genre_id FROM genres
    WHERE genre_name IN ( 'Folk', 'Pop', 'Jazz', ... );

如果您选择两种类型并且两首歌中都有一首歌,或者要检索基于流派选择的某些歌曲的所有类型(即,您搜索“流行',并且想要找到',则需要更多的工作来避免重复Pop,Jazz,Folk','Pop,Techno','Pop','Pop,Whatever',但不是'Techno,爵士,民谣,除Pop之外的任何东西',但它是可行的(例如使用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,或MySQL以外的代码。)