包含多个条目的MySQL字段

包含多个条目的MySQL字段,mysql,Mysql,我有一个页面列表,显示一个乐队已经演奏过,以及在该节目中演奏过的所有其他乐队。到目前为止,我一直在手工编写页面代码,但我计划将所有内容移动到一个表中,以便按波段排序/更易于维护 到目前为止,我们的计划是建立一个“艺术家”领域,典型的参赛者是前“布兰妮·斯皮尔斯、史密斯、尼基·米纳杰”。但我想知道是否有更聪明的方法来做到这一点。每一位艺术家都在自己的领域里?(请记住,有些节目有三个波段,有些节目有100个波段,因此实际创建100个波段是不可行的。)或者,目前的计划是否足够 这方面还很陌生,所以只需

我有一个页面列表,显示一个乐队已经演奏过,以及在该节目中演奏过的所有其他乐队。到目前为止,我一直在手工编写页面代码,但我计划将所有内容移动到一个表中,以便按波段排序/更易于维护

到目前为止,我们的计划是建立一个“艺术家”领域,典型的参赛者是前“布兰妮·斯皮尔斯、史密斯、尼基·米纳杰”。但我想知道是否有更聪明的方法来做到这一点。每一位艺术家都在自己的领域里?(请记住,有些节目有三个波段,有些节目有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的活动中演奏,依此类推。然而,正如您将看到的,可能存在多个艺术家在多个活动中演奏

    现在需要一种从这些表中提取信息的方法。最简单的方法之一是使用:

    有一些方法可以改进此示例。您可能会注意到,
    事件
    表很容易复制场馆名称。您可能希望将场馆分成不同的区域