【问题标题】:mysql query help, getting values from table using relational id's from another tablemysql查询帮助,使用另一个表中的关系ID从表中获取值
【发布时间】:2011-04-08 19:50:04
【问题描述】:

构建表的 SQL,

    --
-- Table structure for table `careers`
--

CREATE TABLE IF NOT EXISTS `careers` (
  `career_id` int(11) NOT NULL auto_increment,
  `career_name` varchar(75) NOT NULL,
  `career_desc` text NOT NULL,
  `degree_needed` enum('Yes','No') NOT NULL,
  `useful_info` text,
  `useful_links` text,
  PRIMARY KEY  (`career_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=34 ;

-- --------------------------------------------------------

--
-- Table structure for table `course`
--

CREATE TABLE IF NOT EXISTS `course` (
  `course_id` int(11) NOT NULL auto_increment,
  `course_type` varchar(75) NOT NULL,
  `course_names` text NOT NULL,
  `extra_needed` enum('Yes','No') default NULL,
  `course_link` varchar(150) NOT NULL,
  `grades_grade_id` int(11) NOT NULL,
  PRIMARY KEY  (`course_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=87 ;

-- --------------------------------------------------------

--
-- Table structure for table `grades`
--

CREATE TABLE IF NOT EXISTS `grades` (
  `grade_id` int(11) NOT NULL auto_increment,
  `grade_desc` text NOT NULL,
  `careers_career_id` int(11) NOT NULL,
  PRIMARY KEY  (`grade_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=87 ;

-- --------------------------------------------------------

我对表格背后的理论的概述是,每个等级都与一个职业相关联,一个职业可以有多个等级,从那一门课程只与一门课程相关联,但用户可能需要做一门额外的课程如果他们选择的人没有得到足够高的认可。

所以我的问题是,如果用户选择低级课程,我如何选择高级课程的课程详细信息,

例如,用户想成为一名电工,而他们在学校的成绩是 2D,这意味着他们只能学习 2 级课程,这意味着要完成该课程,他们必须完成更高级别的课程。我需要能够根据他们选择电工和 2 级课程的事实来展示其他课程是什么,值得注意的是,需要额外工作的课程有一个标记为是的字段“extra_needed”。

我无法现场直播,或者我无法弄清楚如何获取正确的数据,我尝试了以下方法,

SELECT *
FROM `course` , `grades` , `careers`
WHERE `course`.`extra_needed` IS NULL
AND `grades`.`grade_id` = `careers`.`career_id`
AND `careers`.`career_id` =6

但是这会带回 59 行数据,而它应该带回 2 行数据,另一行是用户可以选择的数据行,如果他们选择了其他等级选项。

【问题讨论】:

  • 一些需要回答的问题:(1)如何获取course表中与career_id为6的职业相关的所有行的列表? (2)grade_id和career_id有什么关系?你为什么要在那个领域加入这两个表? (3) 课程表与成绩表有什么关系?
  • 看起来您可能是 SQL 新手?我认为您需要的是 JOIN,而不是像这样从多个表中进行选择。

标签: mysql database foreign-keys relational-database


【解决方案1】:

在我看来你加入了错误的领域,关系看起来如下:

careers.career_id = grades.careers_career_id  
grades.grade_id = course.grades_grade_id

因此对于与 career.career_id = 6 相关的所有课程,查询将如下所示:

select course.*

from course,  
careers,  
grades

where course.grades_grade_id = grades.grade_id  
and grades.careers_career_id = careers.career_id  
and careers.career_id = 6

您将需要一个更复杂的查询来执行您最初询问的操作,这不仅涉及指定一个 career_id,还包括一个 course_id,然后是一个条件语句来说明是否需要任何进一步的课程,但我不确定您是否拥有所有必要的领域,因为您需要知道他们选择的课程与与相关职业相关的所有其他课程之间的关系。如果您只是想查看与该职业相关的所有其他课程,那么您可以添加如下一行:

and course.course_id <> (The course they have selected)

如果只有两个级别的课程,那么您可以添加如下一行,就好像他们选择了更高级别一样,它不能同时满足最后一个陈述和这个陈述,而如果他们选择了较低级别,两者都会是真的:

and course.extra_needed IS NULL

【讨论】:

    【解决方案2】:

    用这个替换你的查询:

    选择 * 从职业作为 c 在 g.careers_career_id = c.career_id 上 LEFT JOIN 成绩 LEFT JOIN course AS crs ON crs.grades_grade_id = g.grade_id 在哪里 c.career_id =6 并且 crs.extra_needed 为空

    它应该工作, 祝你好运

    【讨论】:

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