【问题标题】:Select three different things from three diffrent tables从三个不同的表中选择三个不同的东西
【发布时间】:2019-04-01 15:00:29
【问题描述】:

我想要一个查询来获取彼此拥有最多课程的学生的名字和教师的名字以及这些课程的数量。

表学生:

CREATE TABLE Student(
id    INT    AUTO_INCREMENT,
first_name    VARCHAR(255)    NOT NULL,
last_name    VARCHAR(255),
email    VARCHAR(255)    UNIQUE,
PRIMARY KEY (id)
);

桌老师:

CREATE TABLE Teacher(
id    INT    AUTO_INCREMENT,
first_name    VARCHAR(255)    NOT NULL,
last_name    VARCHAR(255),
email    VARCHAR(255)    UNIQUE,
degree    VARCHAR(10)    NUT NULL,    
PRIMARY KEY (id)
);

餐桌课程:

CREATE TABLE Course(
id    INT    AUTO_INCREMENT,
code    INT    NOT NULL UNIQUE, 
name    VARCHAR(255)    NOT NULL,
st_id    INT,
teach_id    INT,
PRIMARY KEY (id),
FOREIGN KEY st_id REFERENCES Student (id),
FOREIGN KEY teach_id REFERENCES Teacher (id)
);

以下查询是否正确?即我可以在查询中使用 3 SELECT 吗?

查询1:

SELECT      S.first_name
FROM        Student AS S
INNER JOIN  Course AS C
        ON  C.st_id = S.id
SELECT      T.first_name        
FROM        Teacher AS T
INNER JOIN  Course AS CC
        ON  CC.teach_id = T.id
SELECT      COUNT(*)
FROM        Course
WHERE       Course.st_id = S.id
AND         Course.teach_id = T.id
GROUP BY    COUNT(*)
ORDER BY   DESC;

查询2:

SELECT     S.first_name, T.first_name, COUNT(*)
FROM       Student AS S, Teacher AS T, Course
WHERE      Course.st_id = S.id
AND        Course.teach_id = T.id
GROUP BY   COUNT(*)
ORDER BY   DESC;

如果上述问题不正确(可能是第一个问题),请指导我正确回答。

注意:如果排序不是唯一的,请先按教师姓名排序,然后按学生姓名排序(为清楚起见,但对我来说并不重要)。

【问题讨论】:

  • 您能否提供一些(简单)示例数据来解释您的问题的含义?
  • @GordonLinoff 例如,学生 S1 与 T1 老师有 3 门课程,学生 S2 与 T1 老师有 2 门课程......清楚吗?我在问题中添加了一条新注释。
  • 您是否尝试过运行查询?结果如何?
  • @LelioFaieta 我得到了“错误答案”,但没有说明为什么是错误的。
  • 错误答案来自您用来检查作业是否正确的工具?

标签: mysql sql database


【解决方案1】:

您的第二个查询更接近正确,但存在一些问题。我建议使用 JOIN 语句而不是隐式连接。这使查询更易于阅读。

这样的事情应该可以工作:

  SELECT t.first_name,
         t.id,
         s.first_name,
         s.id,
         COUNT(*) AS course_count
    FROM Course c
    JOIN Student s ON c.st_id = s.id
    JOIN Teacher t ON c.teach_id = t.id
GROUP BY t.id, s.id
ORDER BY course_count DESC, t.first_name, s.first_name;

您需要添加一个分组依据才能按每个学生计算。将 group by 放在 id 列上而不是 name 上,可以确保您获得唯一学生和教师的计数,以防您的表中有多个具有相同名字的记录。出于同样的原因,我还将 id 列添加到 select 中,但这些不是必需的,可以删除而不影响查询的准确性。

【讨论】:

    【解决方案2】:
    SELECT t.first_name, t.id, s.first_name, s.id, COUNT(c.id) AS course_count
      FROM course c
      JOIN student s ON c.st_id = s.id
      JOIN teacher t ON c.teach_id = t.id
     GROUP BY t.id, s.id
     ORDER BY t.first_name, s.first_name
    

    基本数据包含在 Courses 表中,Student 和 Teacher 表仅用于收集名称。此查询连接 3 个相关表,计算教师和学生共享的课程数。

    【讨论】:

    • 这应该如何解决 OP 的问题?添加一些解释将有助于未来的用户解决相同的问题
    猜你喜欢
    • 1970-01-01
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多