通过联接

时间:2016-12-03 16:23:54

标签: mysql

首先,我想说我现在没有任何代码支持这一点。我试图概念化一个想法。所以,提前道歉。

基本纲要。我有一个充满节目的数据库,每个节目都可以有多种类型,例如节目A可以是动作,冒险,戏剧。典型的吧?现在,因为我的数据库设置为包含genre_1,genre_2,genre_3等列。我知道这很糟糕,这就是我重做它的原因。

我想创建一个充满流派的表,然后有一个包含show信息的表,然后有一个表来关联这两个。因此,流派和节目表中的主键将是流派节目表中的外键。

我非常确定这是解决这种一对多关系的最佳方式,但如果我有什么遗失,请告诉我。

我的问题是,我不确定我会如何列出动作或冒险类型中的所有节目,或者列出所有正在播放和冒险类型的节目。

我公平地说,有点熟悉联接,但据我所知,我无法弄清楚如何查询。

最终,我要做的是能够查询我的数据库并说“#34;给我每个有动作和冒险类型的节目"然后继续我的路。

我希望这是有道理的。提前感谢您的时间/答案,我真的很感激。

1 个答案:

答案 0 :(得分:0)

一对多101:

主表:

id (primary key, auto_increment), 
name, 
datecreated (datetimestamp), 
dateupdated (datetimestamp)

多对一A

id (primary key, auto_increment),
main_id (foreign key)
name, 
datecreated (datetimestamp), 
dateupdated (datetimestamp)

多对一B

id (primary key, auto_increment),
main_id (foreign key)
name, 
datecreated (datetimestamp), 
dateupdated (datetimestamp)

现在,您可以根据需要加入尽可能多的多对一表:

select
  *
from
  main left join
  table_a on main.id = table_a.main_id left join
  table_b on main.id = table_b.main_id
where
  main.id = X

您将收到许多行,但每行将包含主对象的副本,但包含所有多对一行。这称为Denormalization

或者你可能更喜欢做子循环,你运行一个查询来获取你的主要对象,然后在每个多对一的子循环中,你使用main.id找到{{1}与您的对象匹配的行。