MySQL:组合两个表中的多个值

时间:2013-04-03 20:04:21

标签: php mysql join

我正在制作互动节日节目,并决定将信息保存在数据库中以便于显示和搜索。每个节目可以用三种不同的语言呈现,它们可以有一个或多个表演时间,以及许多不同的艺术家。所以有很多东西可以从show到show不同,这就是为什么最好在自己的表中包含一些信息。尤其是艺术家,作为同一位艺术家可以出现在许多不同的节目中,每个节目的艺术家数量各不相同。

到目前为止,我有一个主表,其中包括节目标题,描述,演出时间,门票价格等。我希望艺术家拥有自己的桌子,并通过他们的ID引用艺术家并将其附加到不同的节目中PHP脚本循环遍历主表。

  1. 如何从主表中的另一个表中引用艺术家ID?

  2. 从他们的桌子中取出艺术家的好查询是什么样的?

  3. 表格(初步计划):

    主要表格

    id | show title | show date | description | performers
    ------------------------------------------------------
    1  | Beethoven  | 13.4.2013 | A classic   | 1,35,22,3
    2  | Mozart     | 14.4.2013 | Fantastic   | 9,4,66
    
    etc..
    

    艺术家表

    id | name  | instrument |
    -------------------------
    1  | Steve | Violin     |
    2  | Alex  | Piano      |
    
    etc...
    

    “表演者”栏中的数字将对应于艺术家表中的ID。但不确定这是引用它们的正确方法。然后PHP脚本将两者结合起来并输出一个完整的show item。

    感谢任何帮助。

3 个答案:

答案 0 :(得分:0)

以下是我如何设置数据模式:

CREATE TABLE `artists` (
  `artist_id` int(10) unsigned NOT NULL auto_increment,
  `artist_name` varchar(100) NOT NULL default '',
  `instrument` varchar(100) NOT NULL default '',
  PRIMARY KEY  (`artist_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


CREATE TABLE `Shows` (
  `show_id` int(11) NOT NULL auto_increment,
  `show_title` varchar(255) NOT NULL default '',
  `description` varchar(255) NOT NULL default '',
  `language` varchar(255) NOT NULL default '',
  PRIMARY KEY  (`show_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


CREATE TABLE `show_times` (
  `show_time_id` int(10) unsigned NOT NULL auto_increment,
  `show_id` int(10) unsigned NOT NULL default '0',
  `show_date` date NOT NULL default '0000-00-00',
  `show_time` time NOT NULL default '00:00:00',
  PRIMARY KEY  (`show_time_id`)
) TYPE=MyISAM AUTO_INCREMENT=1 ;


CREATE TABLE `show_time_artist_lookup` (
  `show_time_id` int(10) unsigned NOT NULL default '0',
  `artist_id` int(10) unsigned NOT NULL default '0',
  PRIMARY KEY  (`show_time_id`,`artist_id`)
) TYPE=MyISAM;

这将允许您对不同的日期/时间使用相同的节目信息。然后艺术家将使用查找表与展示时间联系起来。

编辑: 实际上对于语言来说,由于你有一小组选项,你可以使用二进制数学并在一个字段中存储一个小数字。例如:

1 =英语 2 =意大利语 4 =德语

您可以存储TinyINT值(将架构更改为此值)

`language` tinyint(2) NOT NULL default '1',

使用三个值中的任何一个或组合。例如,如果节目以英语和意大利语提供,您将存储值3.对于所有三种语言,它将是7.然后,当您提取您的节目数据时,您使用任何编程语言进行二进制数学比较来解码它。这是一个解释如何在PHP中执行此操作的页面:http://www.litfuel.net/tutorials/bitwise.htm

答案 1 :(得分:0)

让我们假设您有show表,其中包含两列:show_id,name。其中show_id是主键。 让我们假设您有artist表,其中包含两列:artist_id,name。 artist_id是PRIMARY KEY的地方。

你需要的是m:n关系,意味着一个艺术家可以被分配到许多节目,一个节目可以有很多艺术家。要做到这一点,您需要创建一个新表来存储这种关系。 我们将其命名为show_artist,其中包含两列show_id,artist_id。两列都是PRIMARY KEY。此表中的每一行将存储一个特定艺术家(由artist_id定义)和一个节目(由show_id定义)之间的一个关系

如果您了解show_id,则可以使用此查询获取此节目中的所有艺术家姓名:

SELECT name FROM show_artist JOIN artist USING (artist_id) WHERE show_id = [YOUR SHOW ID]

答案 2 :(得分:0)

您所询问的查询方式是使用通常称为“连接”表的方式。这是一个额外的表格,您可以在其中列出一列中的节目ID和另一列中的艺术家ID。例如:

MainArtists表

showid | artistid
-------------------
1      | 1
1      | 2
2      | 1

在这张连线表中,史蒂夫和亚历克斯都参加了贝多芬的表演,但只有史蒂夫参加了莫扎特秀。

要将它们取出,可以在mysql中使用join命令:

SELECT * FROM Main
INNER JOIN MainArtists ON ShowArtists.showid = Main.id
INNER JOIN Artists ON Artists.id = MainArtists.artistid

此查询会为每个艺术家每个节目提供一行。如果你只想要一个show#1的艺术家列表,你可以在最后添加“WHERE main.id = 1”,依此类推。

最好将Main和Artists中的id列指定为主键,将MainArtists中的showid和artistid列指定为链接回各自表的外键。互联网上有许多关于联接和外键/主键关系的资源,因此搜索这些术语应该可以帮助您。