Php 如何编写这个复杂的SQL语句
我的MySQL表中有三个相同的表,即 第一项结果、第二项结果和第三项结果 这是其中的列Php 如何编写这个复杂的SQL语句,php,mysql,sql,join,subquery,Php,Mysql,Sql,Join,Subquery,我的MySQL表中有三个相同的表,即 第一项结果、第二项结果和第三项结果 这是其中的列 exam_type_id | student_id | subject_id | mark | 或使用虚拟数据的示例 注意:每个科目有三种不同的考试类型(CA1、CA2、CA3和考试), 有三个这样的表,它们有相同的东西,但数据不同,因为它包含第一个术语的数据,另一个是第二个术语的数据,最后一个是第三个术语的数据 first_term_result: exam_type_id | student_i
exam_type_id | student_id | subject_id | mark |
或使用虚拟数据的示例
注意:每个科目有三种不同的考试类型(CA1、CA2、CA3和考试),
有三个这样的表,它们有相同的东西,但数据不同,因为它包含第一个术语的数据,另一个是第二个术语的数据,最后一个是第三个术语的数据
first_term_result:
exam_type_id | student_id | subject_id | mark |
1 | 6 | 7 | 12 |
2 | 6 | 7 | 9 |
3 | 6 | 7 | 13 |
4 | 6 | 7 | 45 |
1 | 4 | 7 | 7 |
2 | 4 | 7 | 5 |
3 | 4 | 7 | 10 |
4 | 4 | 7 | 34 |
second_term_result:
exam_type_id | student_id | subject_id | mark |
1 | 6 | 7 | 15 |
2 | 6 | 7 | 6 |
3 | 6 | 7 | 10 |
4 | 6 | 7 | 50 |
1 | 4 | 7 | 6 |
2 | 4 | 7 | 3 |
3 | 4 | 7 | 9 |
4 | 4 | 7 | 44 |
third_term_result:
exam_type_id | student_id | subject_id | mark |
1 | 6 | 7 | 17 |
2 | 6 | 7 | 8 |
3 | 6 | 7 | 15 |
4 | 6 | 7 | 67 |
1 | 4 | 7 | 12 |
2 | 4 | 7 | 8 |
3 | 4 | 7 | 12 |
4 | 4 | 7 | 50 |
现在我想得到的是SUM()
的first\u term\u result.标记第二个\u term\u result.标记和第三个\u term\u result.标记每个学生的,其中
主题id=7,按学生姓名分组
另一个非常重要的问题是,我将计算每个学生第一学期+第二学期+第三学期的总金额,并且希望能够订购该学生和DESC中科目的总金额,以便我可以相应地定位他们。如果php更容易,请让我知道
谢谢
这对我来说似乎很复杂,但我知道这里有一些大师可以做到这一点,我在某个地方读到,即使使用了汇总,也可以订购
下面是我的代码,显然不起作用
SELECT CONCAT(s.fname,' ',s.mname,' ',s.lname) AS sname,
SUM(f.mark) AS first_total,
SUM(se.mark) AS second_total,
SUM(t.mark) AS third_total
SUM(f.first_total,second.total,third_total) as GT // just to show my intention
FROM students s, first_term_result f, second_term_result se, third_term_result t
WHERE s.studentID=f.student_id AND
s.studentID=se.student_id AND
s.studentID=t.student_id AND
f.subject_id=7 AND
se.subject_id=7 AND
t.subject_id=7
GROUP BY sname ORDER BY GT DESC
如果您进一步规范化您的数据,那么它就不会那么复杂了。为term创建一列,并将所有术语保留在同一个表中。@DMac说真的,这让我哑口无言,似乎知道如果我将所有术语保留在同一个表中,如何实现同样的效果复杂:D我们使用多达200行的查询。如果进一步规范化数据,复杂性将大大降低。为术语列一列,并将所有术语保留在同一个表中。@DMac说真的,这让我哑口无言,似乎知道如果我将所有术语保留在同一个表中,如何实现相同的效果复杂:D我们使用最多200行的查询。我已更新了我的答案,我创建了子查询来提取每个术语的总数。OMG!这是可行的,但列出了学生表中所有在结果表上没有标记的学生姓名。我认为结果表上的左连接可以解决这个问题,希望sirI在内部查询中添加一个WHERE
子句。它仅在学生有第一学期结果的情况下添加学生。谢谢!解决了对我来说似乎是一个复杂的查询,我仍然应该了解更多关于suchI的信息。我已经更新了我的答案,我创建了子查询来提取每个学期的总数。OMG!这是可行的,但列出了学生表中所有在结果表上没有标记的学生姓名。我认为结果表上的左连接可以解决这个问题,希望sirI在内部查询中添加一个WHERE
子句。它仅在学生有第一学期结果的情况下添加学生。谢谢!这对我来说似乎是一个复杂的问题,我仍然应该学习更多这样的知识
SELECT CONCAT(MS.fname,' ',MS.mname,' ',MS.lname) AS sname,
M.FTotal, M.STotal, M.TTotal,
(M.FTotal + M.STotal + M.TTotal) AS GrandTotal
FROM (
SELECT st.studentID,
(
SELECT SUM(f.mark)
FROM first_term_result AS f
WHERE f.subject_id = 7
AND f.student_id = st.studentID
) AS FTotal,
(
SELECT SUM(s.mark)
FROM second_term_result AS s
WHERE s.subject_id = 7
AND s.student_id = st.studentID
) AS STotal,
(
SELECT SUM(t.mark)
FROM third_term_result AS t
WHERE t.subject_id = 7
AND t.student_id = st.studentID
) AS TTotal
FROM students AS st
WHERE st.studentID IN (
SELECT studentID
FROM first_term_result AS fs
WHERE fs.subject_id = 7
AND fs.student_id = st.studentID)
GROUP BY st.studentID
) AS M
JOIN students MS ON M.studentID = MS.studentID
ORDER BY (M.FTotal + M.STotal + M.TTotal) DESC