包含多个条目的MySQL字段
我有一个页面列表,显示一个乐队已经演奏过,以及在该节目中演奏过的所有其他乐队。到目前为止,我一直在手工编写页面代码,但我计划将所有内容移动到一个表中,以便按波段排序/更易于维护 到目前为止,我们的计划是建立一个“艺术家”领域,典型的参赛者是前“布兰妮·斯皮尔斯、史密斯、尼基·米纳杰”。但我想知道是否有更聪明的方法来做到这一点。每一位艺术家都在自己的领域里?(请记住,有些节目有三个波段,有些节目有100个波段,因此实际创建100个波段是不可行的。)或者,目前的计划是否足够包含多个条目的MySQL字段,mysql,Mysql,我有一个页面列表,显示一个乐队已经演奏过,以及在该节目中演奏过的所有其他乐队。到目前为止,我一直在手工编写页面代码,但我计划将所有内容移动到一个表中,以便按波段排序/更易于维护 到目前为止,我们的计划是建立一个“艺术家”领域,典型的参赛者是前“布兰妮·斯皮尔斯、史密斯、尼基·米纳杰”。但我想知道是否有更聪明的方法来做到这一点。每一位艺术家都在自己的领域里?(请记住,有些节目有三个波段,有些节目有100个波段,因此实际创建100个波段是不可行的。)或者,目前的计划是否足够 这方面还很陌生,所以只需
这方面还很陌生,所以只需寻找总体意见/正确方向的一点。谢谢 听起来像是一种多对多的关系。试着读一读吧。听起来像是一种多对多的关系。请仔细阅读。我们的想法是将数据分成几个表,而不是只有一个表。在您的情况下,您将有一个表
艺术家
,一个表显示
。第三个表将连接这两个表,因此称为连接表。
简单的例子:
| show id | artist id |
| 1 | 5 |
| 1 | 7 |
| 2 | 3 |
ID是艺术家的主键并显示表格。我们的想法是将数据拆分为多个表格,而不是只有一个表格。在您的情况下,您将有一个表
艺术家
,一个表显示
。第三个表将连接这两个表,因此称为连接表。
简单的例子:
| show id | artist id |
| 1 | 5 |
| 1 | 7 |
| 2 | 3 |
ID是艺术家的主键并显示表格。您需要创建3个表格:
<<Bands>>
<band_id>, <band_name>, <band_info>
<<Shows>>
<show_id>, <show_name>, <show_info>
<<Plays>>
<play_id>, <play_show_id>, <play_band_id>
,
,
,
填写所有乐队信息和演出(场地)。
然后,每次乐队在演出中演奏时,只需将其代码输入演奏表。您需要创建3个表:
<<Bands>>
<band_id>, <band_name>, <band_info>
<<Shows>>
<show_id>, <show_name>, <show_info>
<<Plays>>
<play_id>, <play_show_id>, <play_band_id>
,
,
,
填写所有乐队信息和演出(场地)。
然后,每次乐队在演出中演奏时,只需在演奏表中输入他们的代码。您可以从简单的多对多连接开始-有关这些主题的详细介绍,请参阅和如何处理 最简单的情况是,您有三个表:
event <---> event_artist <---> artist
现在创建一个包含艺术家列表的表。与活动一样,每个艺术家都被分配了一个唯一的ID:
CREATE TABLE `event` (
`id` INT NOT NULL ,
`venue` VARCHAR(45) NOT NULL ,
`date` DATE NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
CREATE TABLE `artist` (
`id` INT NOT NULL ,
`name` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
您现在需要一个允许将事件行链接到艺术家行的表。这被称为链接表、连接表、交叉引用表或交叉表——我更喜欢术语连接表
CREATE TABLE IF NOT EXISTS `event_artist` (
`event_id` INT NOT NULL ,
`artist_id` INT NOT NULL ,
PRIMARY KEY (`event_id`, `artist_id`) ,
INDEX `fk_event_artist_event` (`event_id` ASC) ,
INDEX `fk_event_artist_artist` (`artist_id` ASC) ,
CONSTRAINT `fk_event_artist_event`
FOREIGN KEY (`event_id` )
REFERENCES `event` (`id` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `fk_event_artist_artist`
FOREIGN KEY (`artist_id` )
REFERENCES `artist` (`id` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
不要担心约束
部分,因为它们可以防止您在事件中为不存在的事件插入条目,从而帮助维护数据库的完整性
现在,我们可以插入一些数据。首先,一些事件:
INSERT INTO `event` (`id`, `venue`, `date`) VALUES
(1, 'Roadhouse', '2010-08-19'),
(2, 'Night & Day Café Music Venue', '2010-08-20'),
(3, 'Night & Day Café Music Venue', '2010-08-25'),
(4, 'The Bridgewater Hall', '2010-09-03');
现在一些艺术家:
INSERT INTO `artist` (`id`, `name`) VALUES
(1, 'Starving Dogs'),
(2, 'The Black and Reds'),
(3, 'Caitlin Rose'),
(4, 'A Little Bite Music - Bella Hardy');
最后,我们可以参加活动和艺术家:
INSERT INTO `event_artist` (`event_id`, `artist_id`) VALUES
(1, 1), (2, 2), (3, 3), (4, 4);
在这个非常简单的示例中,ID为1的艺术家正在ID为1的活动中演奏,ID为2的艺术家在ID为2的活动中演奏,依此类推。然而,正如您将看到的,可能存在多个艺术家在多个活动中演奏
现在需要一种从这些表中提取信息的方法。最简单的方法之一是使用:
有一些方法可以改进此示例。您可能会注意到,事件
表很容易复制场馆名称。您可能希望将场馆分为各自的表,这样您就有了一个场馆表,其中包含了场馆本身的详细信息(地址、电话、网站等)、一个活动表(活动日期、时间、门票价格等),然后是艺术家表
更新
您可以使用MySQL将多行中的值分组到一行中。然而,这类事情实际上是一个视图/显示问题,因此通常会在应用程序中执行。话虽如此,对于简单的情况,您可以使用MySQL[GROUP\u CONCAT][5]
函数:
SELECT
event.venue AS event_venue,
GROUP_CONCAT(artist.name) AS artists
FROM event_artist
JOIN event ON event.id = event_artist.event_id
JOIN artist ON artist.id = event_artist.artist_id
GROUP BY (event.venue);
+------------------------------+-----------------------------------+
| event_venue | artists |
+------------------------------+-----------------------------------+
| Night & Day Café Music Venue | The Black and Reds,Caitlin Rose |
| Roadhouse | Starving Dogs |
| The Bridgewater Hall | A Little Bite Music - Bella Hardy |
+------------------------------+-----------------------------------+
注意,我在上面的查询中遗漏了日期。在这里给出的样本数据中,夜店和日间咖啡馆的两位艺术家出现在不同的日期。如果上面的查询中包含日期列,MySQL将不得不从两个日期中选择一个,您将无法控制哪个日期会出现。您可以从一个简单的多对多连接开始-有关这些主题的详细介绍,请参阅和如何处理
最简单的情况是,您有三个表:
艺术家的桌子
场地的桌子
连接艺术家和场地的表格
例如:
event <---> event_artist <---> artist
现在创建一个包含艺术家列表的表。与活动一样,每个艺术家都被分配了一个唯一的ID:
CREATE TABLE `event` (
`id` INT NOT NULL ,
`venue` VARCHAR(45) NOT NULL ,
`date` DATE NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
CREATE TABLE `artist` (
`id` INT NOT NULL ,
`name` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
您现在需要一个允许将事件行链接到艺术家行的表。这被称为链接表、连接表、交叉引用表或交叉表——我更喜欢术语连接表
CREATE TABLE IF NOT EXISTS `event_artist` (
`event_id` INT NOT NULL ,
`artist_id` INT NOT NULL ,
PRIMARY KEY (`event_id`, `artist_id`) ,
INDEX `fk_event_artist_event` (`event_id` ASC) ,
INDEX `fk_event_artist_artist` (`artist_id` ASC) ,
CONSTRAINT `fk_event_artist_event`
FOREIGN KEY (`event_id` )
REFERENCES `event` (`id` )
ON DELETE CASCADE
ON UPDATE CASCADE,
CONSTRAINT `fk_event_artist_artist`
FOREIGN KEY (`artist_id` )
REFERENCES `artist` (`id` )
ON DELETE CASCADE
ON UPDATE CASCADE)
ENGINE = InnoDB;
不要担心约束
部分,因为它们可以防止您在事件中为不存在的事件插入条目,从而帮助维护数据库的完整性
现在,我们可以插入一些数据。首先,一些事件:
INSERT INTO `event` (`id`, `venue`, `date`) VALUES
(1, 'Roadhouse', '2010-08-19'),
(2, 'Night & Day Café Music Venue', '2010-08-20'),
(3, 'Night & Day Café Music Venue', '2010-08-25'),
(4, 'The Bridgewater Hall', '2010-09-03');
现在一些艺术家:
INSERT INTO `artist` (`id`, `name`) VALUES
(1, 'Starving Dogs'),
(2, 'The Black and Reds'),
(3, 'Caitlin Rose'),
(4, 'A Little Bite Music - Bella Hardy');
最后,我们可以参加活动和艺术家:
INSERT INTO `event_artist` (`event_id`, `artist_id`) VALUES
(1, 1), (2, 2), (3, 3), (4, 4);
在这个非常简单的示例中,ID为1的艺术家正在ID为1的活动中演奏,ID为2的艺术家在ID为2的活动中演奏,依此类推。然而,正如您将看到的,可能存在多个艺术家在多个活动中演奏
现在需要一种从这些表中提取信息的方法。最简单的方法之一是使用:
有一些方法可以改进此示例。您可能会注意到,事件
表很容易复制场馆名称。您可能希望将场馆分成不同的区域