我有一张桌子。它包含两列unique song
和genre
。独特的歌曲存储一个字符串,并不重要。
Genres包含一个字符串数组(适用于该歌曲的类型),字符串中的元素数量是随机的(大到抛弃数组,只是制作其他列)。
我知道这个设置在我设置它时在mySQL中不起作用,但这就是我需要的。
这样做的一种方法是序列化,但我非常希望能够查询所有摇滚歌曲,而无需先查询所有摇滚歌曲,反序列化然后找到我的匹配。
由于所有数组内容属于同一类型,是否有一列支持这样的输入? (int是一种有限数量的int,不是吗?)
答案 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以外的代码。)