【问题标题】:How to write this complex SQL statement如何编写这个复杂的 SQL 语句
【发布时间】:2013-10-18 13:34:59
【问题描述】:

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

first_term_result、second_term_result 和third_term_result

这是其中的列

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    |

现在我想要实现的是获得first_term_result.markSUM() second_term_result.markthird_term_result.mark 每个学生WHERE subject_id=7 按学生姓名分组。

另一个非常重要的问题是我将为每个学生计算 first_term+second_term+third_term 的总和,并且还希望能够为该学生和 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

【问题讨论】:

  • 如果你进一步规范化你的数据,它会变得不那么复杂。为术语创建一列并将所有术语保留在同一个表中。
  • @DMc 说真的,这让我很笨,如果我将所有条款放在同一张桌子上,我似乎知道如何实现同样的目标
  • complex :D 我们使用最多 200 行的查询..

标签: php mysql sql join subquery


【解决方案1】:
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

【讨论】:

  • 我已经更新了我的答案,我创建了子查询来提取每个术语的总数。
  • 天啊!这行得通,但列出了学生表中所有学生姓名,这些学生姓名在结果表上没有标记我认为结果表上的 LEFT JOIN 可以解决它,先生将不胜感激
  • 我在内部查询中添加了一个WHERE 子句。只有当学生有first_term_result 记录时才会添加学生。
  • 谢谢!解决了对我来说似乎是一个复杂的查询,我仍然应该了解更多这样的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
相关资源
最近更新 更多