2013-04-07 74 views
1

这里是我的表:mySQL从另一个表中使用外键获取条目?

class 
------- 
classId 
course //example: CMSC101 
semester //example: Spring 2013 
profId 

professor 
--------- 
profId 
lname 
fname 

我想找到的所有地方全部用姓氏教授史密斯教授的课程。我基本上要做到这一点:

SELECT * FROM `professor` WHERE lname=`Smith` 

然后,把这些结果,并把它们插入其中???是:

SELECT * FROM `class` WHERE profId=`???` 

反正我可以只用一个查询做到这一点?

+0

没有答案能解决问题吗? – 2013-04-07 21:42:22

回答

1

我强烈建议您使用SQL JOINS。你学习一次,并在整个生活中使用。

SELECT c.* 
FROM class AS c 
INNER JOIN professor AS p 
    ON (c.profId = p.profId) 
WHERE p.lname LIKE 'Smith'; 

一些读数为您提供:

SQL Joins
Database Normalization

[更新]
小礼物要送给你:

ER Diagram

SET @[email protected]@UNIQUE_CHECKS, UNIQUE_CHECKS=0; 
SET @[email protected]@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; 
SET @[email protected]@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; 

DROP SCHEMA IF EXISTS `school` ; 
CREATE SCHEMA IF NOT EXISTS `school` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ; 
USE `school` ; 

-- ----------------------------------------------------- 
-- Table `school`.`professor` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `school`.`professor` (
    `professorId` INT UNSIGNED NOT NULL AUTO_INCREMENT , 
    `lname` VARCHAR(40) NOT NULL , 
    `fname` VARCHAR(40) NOT NULL , 
    PRIMARY KEY (`professorId`)) 
ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `school`.`semester` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `school`.`semester` (
    `semesterId` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT , 
    `name` VARCHAR(8) NOT NULL , 
    PRIMARY KEY (`semesterId`)) 
ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `school`.`course` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `school`.`course` (
    `courseId` TINYINT UNSIGNED NOT NULL AUTO_INCREMENT , 
    `code` VARCHAR(10) NOT NULL , 
    `name` VARCHAR(40) NOT NULL , 
    PRIMARY KEY (`courseId`) , 
    UNIQUE INDEX `code_UNIQUE` (`code` ASC)) 
ENGINE = InnoDB; 

-- ----------------------------------------------------- 
-- Table `school`.`class` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `school`.`class` (
    `classId` INT UNSIGNED NOT NULL AUTO_INCREMENT , 
    `courseId` TINYINT UNSIGNED NOT NULL , 
    `semesterId` TINYINT UNSIGNED NOT NULL , 
    `profId` INT UNSIGNED NOT NULL , 
    PRIMARY KEY (`classId`) , 
    INDEX `fk_class_professor_idx` (`profId` ASC) , 
    INDEX `fk_class_semester1_idx` (`semesterId` ASC) , 
    INDEX `fk_class_course1_idx` (`courseId` ASC) , 
    CONSTRAINT `fk_class_professor` 
    FOREIGN KEY (`profId`) 
    REFERENCES `school`.`professor` (`professorId`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_class_semester1` 
    FOREIGN KEY (`semesterId`) 
    REFERENCES `school`.`semester` (`semesterId`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 
    CONSTRAINT `fk_class_course1` 
    FOREIGN KEY (`courseId`) 
    REFERENCES `school`.`course` (`courseId`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION) 
ENGINE = InnoDB; 

USE `school` ; 

-- ----------------------------------------------------- 
-- Placeholder table for view `school`.`class_details` 
-- ----------------------------------------------------- 
CREATE TABLE IF NOT EXISTS `school`.`class_details` (`class_id` INT, `course_id` INT, `course_code` INT, `course_name` INT, `semester_id` INT, `semester_name` INT, `prof_id` INT, `prof_fname` INT, `prof_lname` INT); 

-- ----------------------------------------------------- 
-- View `school`.`class_details` 
-- ----------------------------------------------------- 
DROP TABLE IF EXISTS `school`.`class_details`; 
USE `school`; 
CREATE OR REPLACE VIEW `school`.`class_details` AS 
SELECT 
    w.classId AS `class_id`, 
    w.courseId AS `course_id`, 
    x.`code`  AS `course_code`, 
    x.`name`  AS `course_name`, 
    w.semesterId AS `semester_id`, 
    y.`name`  AS `semester_name`, 
    w.profId  AS `prof_id`, 
    z.fname  AS `prof_fname`, 
    z.lname  AS `prof_lname` 
FROM class AS w 
INNER JOIN course AS x 
    ON (w.courseId = x.courseId) 
INNER JOIN semester AS y 
    ON (w.semesterId = y.semesterId) 
INNER JOIN professor AS z 
    ON (w.profId = z.professorId); 

SET [email protected]_SQL_MODE; 
SET [email protected]_FOREIGN_KEY_CHECKS; 
SET [email protected]_UNIQUE_CHECKS; 

-- ----------------------------------------------------- 
-- Data for table `school`.`professor` 
-- ----------------------------------------------------- 
START TRANSACTION; 
USE `school`; 
INSERT INTO `school`.`professor` (`professorId`, `lname`, `fname`) VALUES (1, 'Smith', 'Willard'); 
INSERT INTO `school`.`professor` (`professorId`, `lname`, `fname`) VALUES (2, 'Burton', 'Tim'); 

COMMIT; 

-- ----------------------------------------------------- 
-- Data for table `school`.`semester` 
-- ----------------------------------------------------- 
START TRANSACTION; 
USE `school`; 
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (1, '2011.1'); 
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (2, '2011.2'); 
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (3, '2012.1'); 
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (4, '2012.2'); 
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (5, '2013.1'); 
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (6, '2013.2'); 
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (7, '2014.1'); 
INSERT INTO `school`.`semester` (`semesterId`, `name`) VALUES (8, '2014.2'); 

COMMIT; 

-- ----------------------------------------------------- 
-- Data for table `school`.`course` 
-- ----------------------------------------------------- 
START TRANSACTION; 
USE `school`; 
INSERT INTO `school`.`course` (`courseId`, `code`, `name`) VALUES (1, 'CALC1', 'Calculus 1'); 
INSERT INTO `school`.`course` (`courseId`, `code`, `name`) VALUES (2, 'CALC2', 'Calculus 2'); 
INSERT INTO `school`.`course` (`courseId`, `code`, `name`) VALUES (3, 'PHYS1', 'Physics 1'); 
INSERT INTO `school`.`course` (`courseId`, `code`, `name`) VALUES (4, 'PHYS2', 'Physics 2'); 

COMMIT; 

-- ----------------------------------------------------- 
-- Data for table `school`.`class` 
-- ----------------------------------------------------- 
START TRANSACTION; 
USE `school`; 
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (1, 1, 3, 1); 
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (2, 2, 3, 1); 
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (3, 3, 3, 2); 
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (4, 4, 3, 2); 
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (5, 1, 4, 1); 
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (6, 2, 4, 1); 
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (7, 3, 4, 2); 
INSERT INTO `school`.`class` (`classId`, `courseId`, `semesterId`, `profId`) VALUES (8, 4, 4, 2); 

COMMIT; 

SELECT * FROM class_details; 

SELECT * FROM class_details WHERE prof_lname LIKE 'Smith'; 
1

这应该工作:

SELECT a.* FROM class a, professor b WHERE a.profId = b.profId AND b.lname = 'Smith'; 

干杯。

+0

如果你想/需要澄清答案...不要犹豫,问。 – 2013-04-07 01:27:14

相关问题