虽然我发现了几个类似的问题,但我无法应用它们来解决我的问题。
问题陈述: - 我有三个MySql表STUDENT,SUBJECT和STUDIES,如下所述: -
STUDENT-
rollno Name
X1 Alpha
X2 Beta
Y1 Zeta
X3 Omega
这里每个rollno中的字母表对应于同一批次/班级的学生。例如,学生X1,X2和X3属于同一类,而Y1属于不同类。
SUBJECT-
Code Title Credits
abc subject1 2
bcd subject2 4
gfp subject3 3
STUDIES-
rollno code
X1 abc
X1 bcd
X1 gfp
X2 bcd
X2 abc
Y1 gfp
X3 abc
我需要帮助构建mysql查询:
a)显示每个学生所承担的学分。 像
Rollno Name Credits
X1 Alpha 9
X2 Beta 6
Y1 Zeta 3
X3 Omega 2
我提出的最好的就是这个
select rollno,
(select sum(credits) from subject
where studies.code=subject.code)
from studies;
但我得到的是学生学习的每个科目单独显示的rollno和学分。(我还没有能够扩展我的查询以从第三个表中获得学生的名字)
b)查找班级/批次的所有学生已经学习的科目。 在给定的场景中,答案是
Batch Subject Code Title
X abc subject1
我可以通过字符串处理提取出不同的批次,但不知道如何从这一点继续进行。
c)作为一名MySql新手,您是否也可以向我指出一些优秀的网络资源,其中包含练习问题,以便学习这些高级查询。我在过去的几天里经历了其中的一些,但是没有发现它们足以开发我的查询所需的概念。
编辑:共享表格的CREATE查询: -
对于SUBJECT:
CREATE TABLE IF NOT EXISTS subject (
code varchar(8) UNIQUE, title varchar(75) NOT NULL,
credits int, check (credits <5),PRIMARY KEY (code));
对于学生:
CREATE TABLE IF NOT EXISTS student (
rollno varchar(9) UNIQUE,name varchar(50));
对于研究:
CREATE TABLE IF NOT EXISTS studies (
rollno varchar(9) NOT NULL,code varchar(50) NOT NULL,
FOREIGN KEY(rollno) REFERENCES student(rollno));
答案 0 :(得分:1)
好吧,对于您的第一个查询,您希望在所有三个表中加入,查找rollno,名称和信用。所以在第一次通过时,你需要像这样加入:
SELECT s.rollno, s.name, sb.credits
FROM student s
INNER JOIN studies st
ON st.rollno = s.rollno
INNER JOIN subject sb
ON sb.code = st.code
这是解决方案的一部分 - 它为您提供了所需的信息,现在您只需使用聚合函数来计算积分,使用SUM和GROUP BY:
SELECT s.rollno, s.name, SUM(sb.credits) AS credits
FROM student s
INNER JOIN studies st
ON st.rollno = s.rollno
INNER JOIN subject sb
ON sb.code = st.code
GROUP BY s.rollno, s.name
第二部分更难,而且可能还有其他(更好)的方法,但这是我的方法:
SELECT q1.batch, q1.code, sb.title
FROM
(SELECT st.code, SUBSTR(st.rollno,1,1) batch,
COUNT(SUBSTR(st.rollno,1,1)) numb
FROM studies st
GROUP BY st.code, SUBSTR(st.rollno,1,1)) q1
INNER JOIN
(SELECT SUBSTR(s.rollno,1,1) batch,
COUNT(SUBSTR(s.rollno,1,1)) numb
FROM student s
GROUP BY SUBSTR(s.rollno,1,1)) q2
ON q1.batch = q2.batch AND q1.numb = q2.numb
INNER JOIN subject sb
ON q1.code = sb.code
一些解释:第一个子查询(q1)计算每个主题中每个批次的学生数量。该输出将是:
abc x 3
bcd x 2
gfp x 1
gfp y 1
第二个子查询(q2)计算每批中的学生数,输出:
x 3
y 1
通过加入这两个子查询,我们只选择批次和批次数相同的主题:
abc x 3
gfp y 1
最后,在主题表上加入以包含主题标题(并将起始SELECT语句设置为仅选择批次,代码和标题),给出输出:
x abc subj1
y gfp subj3
请注意,此处的最后一行(y - subj3)有效,因为&#39; y&#39;批次(其中只有一个)在课程gfp中注册。
至于推荐的网站和资源 - 这有点超出了SO的范围。您可以通过Google搜索和SQL#教程找到很多优秀的在线资源。或者&#39; SQL在线课程&#39;。那里有很多好的免费东西。