Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何编写这个复杂的SQL语句_Php_Mysql_Sql_Join_Subquery - Fatal编程技术网

Php 如何编写这个复杂的SQL语句

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

我的MySQL表中有三个相同的表,即

第一项结果、第二项结果和第三项结果

这是其中的列

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