用于从相关表

时间:2016-02-02 07:28:16

标签: mysql subquery

虽然我发现了几个类似的问题,但我无法应用它们来解决我的问题。

问题陈述: - 我有三个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));

1 个答案:

答案 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;。那里有很多好的免费东西。