Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/257.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在mySQL列中存储随机大小的数组_Php_Mysql - Fatal编程技术网

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

Php 在mySQL列中存储随机大小的数组,php,mysql,Php,Mysql,我有一张桌子。它包含两个栏目独特歌曲和流派。独特的歌曲储存了一个字符串,其实什么都不重要 体裁包含一个字符串数组(适用于歌曲的体裁),字符串中的元素数是随机的(大到可以舍弃数组,只需要增加列) 我知道这个设置在我设置的mySQL中不起作用,但这正是我所需要的 一种方法是序列化,但我非常希望能够查询出所有的摇滚歌曲,而不必首先查询它们,取消序列化,然后找到我的匹配项 由于所有数组内容都是相同的类型,是否有一列支持这样的输入?(int在某种程度上是有限的int数组,不是吗?你有一种多对多的关系——一

我有一张桌子。它包含两个栏目
独特歌曲
流派
。独特的歌曲储存了一个字符串,其实什么都不重要

体裁包含一个字符串数组(适用于歌曲的体裁),字符串中的元素数是随机的(大到可以舍弃数组,只需要增加列)

我知道这个设置在我设置的mySQL中不起作用,但这正是我所需要的

一种方法是序列化,但我非常希望能够查询出所有的摇滚歌曲,而不必首先查询它们,取消序列化,然后找到我的匹配项


由于所有数组内容都是相同的类型,是否有一列支持这样的输入?(int在某种程度上是有限的int数组,不是吗?

你有一种多对多的关系——一首歌可以有多种流派,一种流派可以被多种歌曲使用

创建一个名为Song的表,该表包含有关Song的信息和一些唯一标识符。为了便于讨论,我们只能说这是歌曲的名字:s_name

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


最后,创建一个名为SongAndGene的表,它将充当桥接表。它将有两列-一个歌曲ID(在我们的例子中是s_名称)和一个流派ID(比如g_名称)。如果一首歌曲S有多个流派G1和G2,那么该歌曲将有两行-(S,G1)和(S,G2)。

您有一个多对多关系-一首歌曲可以有多个流派,一个流派可以被多首歌曲使用

创建一个名为Song的表,该表包含有关Song的信息和一些唯一标识符。为了便于讨论,我们只能说这是歌曲的名字:s_name

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


最后,创建一个名为SongAndGene的表,它将充当桥接表。它将有两列-一个歌曲ID(在我们的例子中是s_名称)和一个流派ID(比如g_名称)。如果一首歌曲S有多个流派G1和G2,那么该歌曲将有两行-(S,G1)和(S,G2)。

您现在有了一个表,比如说,
歌曲
,其中包含一列
流派

要了解歌曲的类型#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
);
要存储song 123属于“Folk”、“Pop”、“Jazz”和“Anwhere”类型的事实,您可以运行:

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\u CONCAT
和/或
groupby
,或在MySQL之外的代码中)。

您现在有了一个表,比如说,
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
);
要存储song 123属于“Folk”、“Pop”、“Jazz”和“Anwhere”类型的事实,您可以运行:

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\u CONCAT
和/或
GROUP BY
,或在MySQL之外的代码中)。

重新设计架构是否为时已晚?在列中放置数组非常糟糕,您应该使用关系表。您可以使用
内爆()
在列中存储逗号分隔的列表。当您要查询该列时,可以使用
FIND\u in\u SET()
查看列表中是否有值。但这很难处理,而且几乎不可能进行复杂的查询。我可以使用一个附加表,但如果您仔细考虑的话,这也不会真正起作用。问题是,在第一个表中,每行可以有多个类型。如果我创建一个类型表,那么我还有多个类型每种体裁都有e首歌曲,我又回到了起点。这是一个多对多关系表。重新设计架构是否为时已晚?在列中放置数组非常糟糕,您应该使用关系表。您可以使用
infrade()
在列中存储逗号分隔的列表。当您要查询列时,可以使用
FIND\u in\u SET()
查看列表中是否有值。但这很难处理,而且几乎不可能进行复杂的查询。我可以使用一个附加表,但如果您仔细考虑的话,这也不会真正起作用。问题是,在第一个表中,每行可以有多个类型。如果我创建一个类型表,那么我还有多个类型我回到了开始。这是一个多对多关系表。所以,第三个表就像一个连接索引,我会查找所有的g_名称,其中s_名称是某首歌,我们会将所有的流派连接到某首歌。是的,这正是我要找的。谢谢!所以,第三个表就像一个co的索引连接,我会查找所有g_名称,s_名称是某首歌,我们会将所有的genreas连接到某首歌。是的,这正是我要找的。谢谢!