我想查询一下彼此之间课程最多的学生的名字和老师的名字,这些课程的数目。
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;
如果上述查询不正确(可能第一个查询是错误的),请指导我更正答案。
注意::如果排序不是唯一的,请先按教师的姓名进行排序,然后再按学生的姓名进行排序(为清楚起见,但对我而言并不那么重要)。
答案 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列添加到选择中,但是这些列不是必需的,可以删除而不会影响查询的准确性。