【问题标题】:SQL: Inner join help for assessmentSQL:用于评估的内连接帮助
【发布时间】:2016-01-20 10:58:18
【问题描述】:

在我在学校的受控评估中,我被困在这个问题上:

创建、运行、测试、解释和演示脚本以执行以下操作:

  1. 使用 OCR 考试委员会生成所有条目的列表,显示:
    • 有参赛作品的学生姓名
    • 学生参加考试的科目名称和入学级别。
  2. 生成所有学生的列表,显示学生的姓名,然后是要参加的考试 采取。此列表应按学生姓氏的字母顺序排列。

在我的代码中,我不知道如何使用 INNER JOIN 连接超过 2 个表,但是如果我尝试使用 'ON' 语句不想工作,我不知道如何解决这个问题.

CREATE 表格和INSERT 数据:

CREATE TABLE IF NOT EXISTS students
(
student_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
first_name VARCHAR(20) NOT NULL,
middle_name VARCHAR(20),
last_name VARCHAR(40) NOT NULL,
email VARCHAR(60) NOT NULL,
password CHAR(40) NOT NULL,
reg_date DATETIME NOT NULL,
PRIMARY KEY (student_id),
UNIQUE (email)
);

INSERT INTO students (first_name,last_name,email,password,reg_date) VALUES 
("ex1","ex1.1","example1@gmail.com","11062001",'2009-12-04 13:25:30'),
("ex2","ex2.2","example2@gmail.com","ex123",'2015-02-12 15:20:45'),
("my name is jeff","21","kid","mynameis21kid@vine.com","yolo",'2014-09-21 14:15:25'),
("Mr.Right","Mr.Calvin","Mr.Hildfiger","Mr.misters@mister.com","mistermaster",'2015-06-04 19:50:35'),
("Bob","Dabuilda","bobthebuilder@fixit.com","BTBCWFI?",'2005-11-12 21:20:55');

CREATE TABLE IF NOT EXISTS subjects
(
subject_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
subject_name VARCHAR(20) NOT NULL,
level_of_entry VARCHAR(5) NOT NULL,
exam_board VARCHAR(10) NOT NULL,
PRIMARY KEY (subject_id),
UNIQUE(subject_id)
);

INSERT INTO subjects (subject_name,level_of_entry,exam_board) VALUES 
("Chemistry","AS","OCR"),
("Biology","GCSE","AQA"),
("Music","GCSE","Edexcel"),
("English","A","OCR"),
("Physics","A","AQA"),
("Computing","GCSE","Edexcel"),
("French","A","AQA"),
("Maths","AS","OCR"),
("Product Design","GCSE","AQA"),
("History","AS","OCR");

CREATE TABLE IF NOT EXISTS entries
(
entry_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
date_of_exam DATE NOT NULL,
student_id INT UNSIGNED NOT NULL,
subject_id INT UNSIGNED NOT NULL,
FOREIGN KEY (student_id) REFERENCES students(student_id),
FOREIGN KEY (subject_id) REFERENCES subjects(subject_id),
PRIMARY KEY (entry_id)
);

INSERT INTO entries (date_of_exam, student_id, subject_id) VALUES 
('2015-05-31', 1, 6),
('2015-05-31', 2, 10),
('2015-01-21', 3, 3),
('2015-01-21', 4, 7),
('2015-09-13', 5, 1),
('2015-09-13', 2, 9),
('2015-12-06', 4, 8),
('2015-12-06', 1, 2),
('2015-04-01', 3, 5),
('2015-04-01', 5, 4);

还有SELECT

SELECT entries.*, subjects.subject_name, subjects.level_of_entry
FROM subjects
    INNER JOIN entries,
               students ON entries.subject_id = subjects.subject_id
WHERE subjects.exam_board LIKE "OCR%";

【问题讨论】:

  • 不要混合显式和隐式(逗号分隔)JOIN 语法。如果你这样做,太容易出错了。一直坚持显式JOIN!!!
  • 这个评估在什么意义上是“受控”的?
  • @Strawberry ocr.org.uk/qualifications/by-type/gcse-related/… 说“受控评估是在受监督的环境/教室中进行的个人候选人工作。这是由监管机构引入的,以解决有关课程作业的一些问题,例如抄袭。”
  • @ceejayoz 我们不是稍微破坏了这个目标吗?
  • @Strawberry 我想是的,是的,但我不是来自英国。也许你可以提前准备?

标签: mysql sql inner-join


【解决方案1】:

在连接之后立即提供连接条件以使其简单易读。正如 jarlh 所写,不要将显式连接与逗号分隔列表混合。如果您知道要查找的确切值,则无需对模式匹配进行类似操作。只需使用具有确切值的 = 运算符。

SELECT *
FROM subjects
INNER JOIN entries ON entries.subject_id = subjects.subject_id --join 2 tables
INNER JOIN students ON entries.student_id=students.student_id --join the 3rd tables
WHERE subjects.exam_board = "OCR";

【讨论】:

    【解决方案2】:

    使用明确的JOIN,从现在开始,永不回头!也可以使用别名来保持整洁。

    SELECT e.*, su.subject_name, su.level_of_entry
    FROM subjects su
    INNER JOIN entries e ON e.subject_id = su.subject_id
    INNER JOIN students st ON e.student_id = st.student_id 
    WHERE su.exam_board LIKE "OCR%";
    

    【讨论】:

      【解决方案3】:

      我认为您可能需要的代码如下所示:

      select entries.*, subjects.subject_name, subjects.level_of_entry
      from entries
      join students on students.student_id = entries.student_id
      join subjects on subjects.subject_id = entries.subject_id
      where exam_board = 'OCR';
      

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2011-06-10
        • 1970-01-01
        • 1970-01-01
        • 2011-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多