【问题标题】:i made a many to many relationship between the following tables, have i done it right? secondly i want a join query for them我在下表之间建立了多对多关系,我做对了吗?其次,我想为他们进行连接查询
【发布时间】:2014-06-15 05:14:01
【问题描述】:

以下表格之间存在多对多关系:

create table instructors
(i_id int not null identity(1,1) primary key,
i_name varchar(50), etc...)

create table members
(
m_id int not null identity(1,1) primary key,
m_name varchar(50, etc...))

create table schedule
(sch_id int not null identity(1,1) primary key,
sch_session varchar(10))<BR>
-- session is(morning, afternoon, evening)<br>

下面是我的连接表

create table Ins_Mem_Sch
(ins_mem_sch_id int not null identity(1,1) primary key,
i_id int not null foreign key references instructors(i_id),
m_id int not null foreign key references members(m_id),
sch_id int not null foreign key references schedules(sch_id)
)

我想知道到目前为止我所做的是否正确,其次我尝试通过查询加入它们,但我做不到,可能是因为我没有练习多对多关系的加入,我不是一个完美的程序员,所以我想要一个连接查询来从所有表中获取数据。 感谢您的帮助。
问候,

【问题讨论】:

  • 是的,表格看起来不错,只有一件事只是从 Ins_Mem_Sch 中删除了不需要的主键,以及您要显示什么样的数据?
  • 感谢您的评论,所以您的意思是我完全删除了 ins_mem_sch_id 列?,我想显示 * 成员、讲师和他们的日程安排
  • @AbhikChakraborty PRIMARY KEY 是绝对需要的,而不是 ins_mem_sch_id 列!
  • 除非您的应用程序对 Ins_Mem_Sch 进行了删除操作,否则不需要它,在这种情况下您可以保留 ins_mem_sch_id ,因为在主键上删除更快。但如果它不存在,那么只需将其删除。
  • @Strawberry 是的,列绝对需要PK,我在表中给出了Ins_Mem_Sch 应该保留ins_mem_sch_id 或不保留ins_mem_sch_id 的原因

标签: mysql sql sql-server database join


【解决方案1】:

表看起来不错,只是最后一个表Ins_Mem_Sch不需要主键ins_mem_sch_id

现在加入这些表格非常容易。考虑当您在表Ins_Mem_Schi_id , m_id and sch_id 中有行时,您可以使用以下类型的连接

(我提供了 MYSQL 示例,因为您使用 MYSQL 标记了问题)

select 
i.i_name,
m.m_name,
s.sch_session 
from 
Ins_Mem_Sch ims
inner join instructors i on i.i_id = ims.i_id
inner join members m on m.m_id = ims.m_id
inner join schedule s on s.sch_id = ims.sch_id

以上只是列出匹配所有表的数据的示例。 在许多其他情况下,您可能需要根据要求获取数据,而在不知道这些情况下很难评论。

【讨论】:

  • 主键是关系表的先决条件。在这种情况下,我们有一个非常好的 NATURAL 复合候选键 (i_id,m_id),可以设置为 PRIMARY,这意味着不需要代理键。
  • 非常感谢@Abhik Chakraborty,我仍然感到困惑的一件事是,我是否应该删除 ins_mem_sch 列
  • 好的,亲爱的,再次感谢您快速而完整的回答
【解决方案2】:

即使您的要求还不清楚,但您可以在查询中使用连接,如下所示:

SELECT 
DISTINCT ins.i_name,mmb.m_name,sch.sch_session 
FROM Ins_Mem_Sch ims 
JOIN instructors ins ON ims.i_id=ins.i_id 
JOIN members mmb ON mmb.m_id=ims.m_id 
JOIN `schedule` sch ON sch.sch_id=ims.sch_id 
WHERE your_col='your_value';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 1970-01-01
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多