从三个不同的表中选择三个不同的内容

时间:2019-04-01 15:00:30

标签: mysql sql database

我想查询一下彼此之间课程最多的学生的名字和老师的名字,这些课程的数目。

Table Student:

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吗?

query1:

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;

query2:

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;

如果上述查询不正确(可能第一个查询是错误的),请指导我更正答案。

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

2 个答案:

答案 0 :(得分:0)

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

基本数据包含在“课程”表中,而“学生”和“教师”表仅是收集姓名所必需的。该查询将所涉及的3个表连接起来,计算出老师和学生共享课程的数量。

答案 1 :(得分:0)

您的第二个查询更接近正确,但存在一些问题。我建议使用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列而不是名称上,可以确保获得唯一学生和教师的计数。出于相同的原因,我还将id列添加到选择中,但是这些列不是必需的,可以删除而不会影响查询的准确性。