php - 如何在单个 SQL 语句中实现此目的

标签 php mysql pivot pivot-table

请问我手头有问题,

我的 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/

相关文章:

javascript - 成功提交表单并在确认消息上单击“确定”后重定向到同一页面

PHP持久脚本和最大执行时间

MySQL:显示每月销售额并包括没有销售额的月份

sql - 选择值作为列

python - Python 中的光滑枢轴和映射

javascript - 在 Javascript URL 中传递两个变量以根据传递的值更新下拉列表

php - WordPress 使用表单更新数据库

MYSQL-无法计算字段之间的时间差并且无法使用 where 子句

php - 使用 PHP 和 MySql 创建考勤表

python - 使用数据透视表 pandas 进行排序