Справка по запросу MySQL, получение значений из таблицы с использованием реляционных идентификаторов из другой таблицы - PullRequest
4 голосов
/ 06 сентября 2010

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-х классные оценки в школе, это означает, что он может пройти только курс уровня 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 ]

1 голос
/ 21 сентября 2010

Похоже, вы вступаете в неправильные поля, отношения выглядят так:

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
0 голосов
/ 26 ноября 2010

Замените ваш запрос этим:

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

Это должно работать, Удачи

...