MYSQL更新表错误

时间:2015-12-09 16:31:18

标签: mysql sql

我想为列total做一些计算 通过为特定列添加两个标记列 std_id

例如30+25=55,std_id 32的总计= 55

+--------+-----------+-------+----+----------------+-------+    
| std_id | course_id | marks | mp | subject        | total |    
+--------+-----------+-------+----+----------------+-------+    
|     32 |        40 | 30.00 | 22 | Elective Maths |     0 |    
|     32 |        40 | 25.00 | 12 | Elective Maths |     0 |    
|     39 |        40 | 30.00 | 22 | Elective Maths |     0 |    
|     39 |        40 | 20.00 | 12 | Elective Maths |     0 |   
+--------+-----------+-------+----+----------------+-------+

我试过像

这样的东西
update student_reports 
set total= sum(marks) 
where std_id=std_id;

但不起作用, 非常感谢任何帮助,尤其是不需要更改表格结构的帮助

对于上面的第一个表,使用单个course_id,代码 通过GILEYS完美计算出总数

更新student_reports r,(     选择std_id,sum(marks)为total     来自student_reports     按std_id分组 )t 设r.total = t.total 其中r.std_id = t.std_id;

我的下一个问题是,如果我添加另一个course_id值,将其设为 (40,43) 表格,我该怎样做新的总计

+ -------- + ----------- + ------- + ---- + ------------ ---- + ------- +

| std_id | course_id |标记| mp |主题|总计|

+ -------- + ----------- + ------- + ---- + ------------ ---- + ------- +

| 32 | 40 | 30.00 | 22 |选修数学| 0 |

| 32 | 40 | 25.00 | 12 |选修数学| 0 |

| 39 | 40 | 30.00 | 22 |选修数学| 0 |

| 39 | 40 | 20.00 | 12 |选修数学| 0 |

| 32 | 43 | 40.00 | 22 |核心数学| 0 |

| 32 | 43 | 20.00 | 12 |核心数学| 0 |

| 39 | 43 | 45.00 | 22 |核心数学| 0 |

| 39 | 43 | 40.00 | 12 |核心数学| 0 |

+ -------- + ----------- + ------- + ---- + ------------ ---- + ------- +

我试过像

这样的东西

更新student_reports r,(选择std_id,course_id,subject,sum(marks) 作为来自student_reports group by std_id的总和)t set r.total = t.total 其中r.std_id = t.std_id AND r.course_id = t.course_id AND r.subject = t.subject;

但是没有给出总数,因为我会专家,请需要 再次提供帮助

以达到预期的结果

+ -------- + ----------- + ------- + ---- + ------------ ---- + ------- +

| std_id | course_id |标记| mp |主题|总计|

+ -------- + ----------- + ------- + ---- + ------------ ---- + ------- +

| 32 | 40 | 30.00 | 22 |选修数学| 55 |

| 32 | 40 | 25.00 | 12 |选修数学| 55 |

| 39 | 40 | 30.00 | 22 |选修数学| 50 |

| 39 | 40 | 20.00 | 12 |选修数学| 50 |

| 32 | 43 | 40.00 | 22 |核心数学| 60 |

| 32 | 43 | 20.00 | 12 |核心数学| 60 |

| 39 | 43 | 45.00 | 22 |核心数学| 95 |

| 39 | 43 | 40.00 | 12 |核心数学| 95 |

+ -------- + ----------- + ------- + ---- + ------------ ---- + ------- +

2 个答案:

答案 0 :(得分:0)

试试这个:

update student_reports 
set total = (
    select sum(marks) 
    from student_reports 
    where std_id = 32
) 
where std_id = 32;

或者如果您想要更新整个表:

    update student_reports 
    set total = t.total
    from (
        select std_id, sum(marks) as total
        from student_reports 
        group by std_id
    ) t
   where t.std_id = student_reports.std_id;

编辑,上面的内容可能不适用于MySQL,你可以试试以下内容:

update student_reports r, (
    select std_id, sum(marks) as total
    from student_reports 
    group by std_id
) t 
set r.total = t.total 
where r.std_id = t.std_id;

答案 1 :(得分:0)

总共'列可能会导致悲伤,因为一旦为给定的id插入新数据,它就会出错。此查询将为您提供相同的结果,而无需在每次获取新数据时运行更新。如果您需要它像表格一样,您可以查看creating a view

SELECT t.std_id, t.course_id, t.marks, t.mp, t.subject, c.total
FROM student_reports AS t
JOIN (SELECT std_id, SUM(marks) AS total
      FROM student_reports
      GROUP BY std_id) AS c ON c.std_id = t.std_id