mysql查询帮助,从另一个表中使用关系id获取表中的值

时间:2010-09-06 15:13:43

标签: mysql database foreign-keys relational-database

建立表格的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 ;

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

我在桌子背后的理论概述是,每个年级都与职业相关,一个职业可以有很多年级,从一个课程只有一个课程,但用户可能需要做一个额外的课程如果他们选择的人没有足够的认可。

所以我的问题是如果用户选择低级课程,如何选择更高级别课程的课程详情

例如,用户想成为一名电工,他们在学校有2个D级,这意味着他们只能完成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行数据,另一行带回用户可以选择其他等级选择的数据行。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

用以下内容替换您的查询:

SELECT *
FROM careers AS c
LEFT JOIN grades AS g ON g.careers_career_id = c.career_id
LEFT JOIN course AS crs ON crs.grades_grade_id = g.grade_id
WHERE c.career_id =6
AND crs.extra_needed IS NULL

它应该工作, 祝你好运