请问我手头有问题,
我的 MySQL 数据库中有以下表
students
studentID | fname | mname | lname |
1 | Wilson | Dale | Micheal|
examtype
examtypeID | name |
1 | ca 1
2 | ca 2
3 | ca 3
4 | exam
first_term_result
student_id | examtype_id | subject_id | mark
1 | 1 | 7 | 12
1 | 2 | 7 | 10
1 | 3 | 7 | 9
1 | 4 | 7 | 45
目前我有这个SQL语句
SELECT CONCAT(students.fname,' ',students.mname,' ',students.lname)
AS student_name, students.studentID, exam_type.name, first_term_result.mark
FROM students, exam_type, first_term_result
WHERE students.studentID=first_term_result.student_id
AND exam_type.exam_typeID=first_term_result.exam_type_id
AND first_term_result.subject_id=7
它的工作原理是我得到一个表,我可以用它来获取这样的数组
我如何将其放入该数组 使用 codeigniter 框架:
$sheet = $this->teacher_model->spreadsheet();
$data = array();
foreach($sheet as $row)
{
$data[$row['student_name']]['studentID']=$row['studentID'];
$data[$row['student_name']][$row['name']]=$row['mark'];
}
Array
(
[Wilson Dale Micheal] => Array
(
[studentID] => 1
[CA 1] => 12
[CA 2] => 10
[CA 3] => 9
[Exam] => 45
)
)
另外一条SQL语句如下:
SELECT CONCAT(students.fname,' ',students.mname,' ',students.lname)
AS students_name, students.studentID, SUM(first_term_result.mark) as Total
FROM students, first_term_result
WHERE students.studentID=first_term_result.student_id
AND first_term_result.subject_id=7 group by students_name
给出类似这样的东西:
Array
(
[Wilson Dale Micheal] => Array
(
[studentID] => 1
[Total] => 76
)
)
合并两个数组我得到的结果是:
这就是我合并两个函数的方式 数组合并() 没用,所以我用了:
$data = array();
foreach($sheet as $row)
{
$data[$row['student_name']]['studentID']=$row['studentID'];
$data[$row['student_name']][$row['name']]=$row['mark'];
}
foreach($total as $tol)
{
$data[$tol['student_name']]['Total']=$tol["Total"];
}
Array
(
[Wilson Dale Micheal] => Array
(
[studentID] => 1
[CA 1] => 12
[CA 2] => 10
[CA 3] => 9
[Exam] => 45
[Total] => 76
)
)
但是我想知道是否可以用一条 SQL 语句实现所有这些,以便我能够进行 ORDER BY Total DESC,这样得分最高的学生将排在第一位,依此类推。 当前语句不会将 Total 按 DESC 排序,尽管我有数组,就像我想要的那样。
谢谢
最佳答案
SELECT CONCAT(s.fname,' ',s.mname,' ',s.lname) AS student_name,
MAX(s.studentID) As StudentID,
e.name As Name,
SUM(f.mark) As Mark
FROM Students s
JOIN First_Term_Result f ON s.studentID = f.student_id
JOIN Exam_Type e ON e.examtypeID = f.examtype_id
WHERE f.subject_id=7
GROUP BY CONCAT(s.fname,' ',s.mname,' ',s.lname), e.name WITH ROLLUP;
基于您的样本数据的结果将是:
STUDENT_NAME STUDENTID NAME MARK
Wilson Dale Micheal 1 ca 1 12
Wilson Dale Micheal 1 ca 2 10
Wilson Dale Micheal 1 ca 3 9
Wilson Dale Micheal 1 exam 45
Wilson Dale Micheal 1 (null) 76
(null) 1 (null) 76
ROLLUP
添加了两行:
- 学生总计(将为每个学生显示)
- 总计(所有学生一次)
如果您的MySQL版本支持GROUPING
功能,您可以在“总”行中使用自己的标签而不是NULL。
这是SQL Fiddle您可以在其中通过修改表格内容进行测试。
关于php - 如何在单个 SQL 语句中实现此目的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19252771/