【问题标题】:Display values from several tables that share one foreign key显示共享一个外键的多个表中的值
【发布时间】:2013-11-13 16:28:37
【问题描述】:

在 mysql 数据库中,我存储了 5 个表。我正在使用 php 来存储和检索数据。我想以链接的方式检索/回显/显示这 5 个表的信息。我有academy_id 作为每个表上的外键。每个学院都有一个联系人。一些学院可能共用同一个联系人。但不知道如何展示每个学院的独特信息。如何通过 php/mysql 选择查询显示这些值?

Academy Name | MOU_ID | Academy_ID | STATUS | Academy Created | Course Name | Course Start Date | Instructor First Name | Contact First Name

表格

CREATE TABLE IF NOT EXISTS `academies` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(25) NOT NULL,
  `mou_id` int(11) default NULL,
  `academy_id` int(11) NOT NULL,
  `status` enum('INACTIVE','ACTIVE') NOT NULL default 'ACTIVE',
  `created_date` date NOT NULL
  PRIMARY KEY  (`id`)
);

INSERT INTO `courses` (`course_id`, `course_name`) VALUES
(1, 'MATH'),
(2, 'ENGLISH'),
(3, 'BIOLOGY'),

CREATE TABLE IF NOT EXISTS `academy_courses` (
  `unique_id` int(11) NOT NULL auto_increment,
  `academy_id` int(11) NOT NULL,
  `course_id` int(11) NOT NULL,
  `start_date` date default NULL,
  PRIMARY KEY  (`unique_id`),
  KEY `course_id` (`academy_id`,`course_id`)
);


CREATE TABLE IF NOT EXISTS `instructors` (
  `instructor_id` int(11) NOT NULL auto_increment,
  `academy_id` int(11) NOT NULL,
  `instructor_fname` varchar(50) NOT NULL
  PRIMARY KEY  (`instructor_id`),
  KEY `academy_id` (`academy_id`)
);


CREATE TABLE IF NOT EXISTS `main_contact` (
  `contact_id` int(11) NOT NULL auto_increment,
  `academy_id` int(11) NOT NULL,
  `contact_fname` varchar(50) NOT NULL,
  PRIMARY KEY  (`contact_id`),
  KEY `academy_id` (`academy_id`)
);

CREATE TABLE IF NOT EXISTS `main_contact_bridge` (
  `academy_id` int(11) NOT NULL,
  `contact_id` int(11) NOT NULL,
  PRIMARY KEY  (`contact_id`,`academy_id`),
  KEY `academy_id` (`academy_id`)
);

【问题讨论】:

  • 是你想展示的每一门课程吗?
  • 您缺少课程表吗?
  • 您想要加入,在这种情况下,专用视图可能是个好主意。 dev.mysql.com/doc/refman/5.0/en/views.html
  • @FilipeSilva 我没有包含course 表,因为它只显示了可供选择的课程列表。 academy_courses 存储从 courses 中选择的课程
  • @Code_Ed_Student。是的,但不是课程名称。您可能应该在讲师和课程之间建立某种联系。否则,这些查询会给你很多重复的结果。并解释联系表与其余部分的联系是什么

标签: php mysql


【解决方案1】:

我会将instructor_id 添加到academy_courses,否则如果您有多个讲师,您将获得为每个讲师重复的所有数据。然后你会这样做:

SELECT a.name AS 'Academy Name', 
       a.mou_id AS 
       a.academy_id
       a.status
       a.created_date AS 'Academy Created',
       c.course_name AS 'Course Name',
       ac.start_date AS 'Course Start Date',
       i.instructor_fname AS 'Instructor First Name',
       co.contact_fname AS 'Contact First Name'
FROM academies a
INNER JOIN academy_courses ac ON a.id = ac.academy_id
INNER JOIN courses c ON c.id = ac.course_id
INNER JOIN instructors i ON i.instructor_id = ac.instructor_id
INNER JOIN main_contact co ON co.academy_id = a.id

如果您想从 Academy 获取信息,即使课程/academy_courses/etc 不存在,您也可以编写一个 LEFT JOIN。

【讨论】:

  • 你的意思是From academies a
  • 没关系:)。但是AS 的目的是什么?也不确定如何将nstructor_id 添加到 academy_courses,因为信息将首先提交,然后立即显示/回显。在提交数据之前,那个时刻的instructor_id 不会存在。
  • AS 是说该列将有一个别名(后面的文本)。关于 istructor_id,您应该创建学院,然后是课程,然后是讲师,然后才是具有您想要用于该记录的 id 的 academy_course。
  • 您还应该在表中添加外键。非原始表中的 academy_id、instructor_id、course_id 应为外键。
  • 哦,但在形式上,我可以同时做所有事情。我一次请求学院、课程和讲师信息,然后在提交表单后将结果存储在数据库中。我必须按照你提到的顺序做每一个?不同的形式?
【解决方案2】:

我认为这就是你想要得到的:

SELECT a.name, a.mou_id, a.academy_id, a.status, a.created_date, ac.course_id, ac.start_date, i.instructor_fname, mc.contact_fname
FROM academy_courses ac 
LEFT JOIN academies a USING (academy_id) 
LEFT JOIN instructors i USING (academy_id) 
LEFT JOIN main_contact mc USING (academy_id);

【讨论】:

  • 为什么是FROM academy_courses ac 而不是FROM academies a 然后是LEFT JOIN academy_courses a USING (academy_id)
  • 您将获得课程列表,这就是原因。不是学院列表。您将获得包含该课程相关信息的课程。这样在我的脑海中更有意义。
【解决方案3】:

您正在寻找的是加入表格。有不同类型的连接。请看这个解释http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-27
    • 2021-12-02
    • 2020-06-16
    • 2016-03-12
    • 1970-01-01
    • 2019-02-14
    相关资源
    最近更新 更多