You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何按学科ID分组计算课程总费用?MySQL查询问题求助

问题分析与解决方案

你的核心问题是分组逻辑错误,加上sql_mode=only_full_group_by的严格约束导致报错,具体原因和修复方法如下:

为什么原代码出错?

  1. 分组字段不符合需求:你最初按c.Course_ID分组,这是按单门课程聚合,得到的是每门课程的费用(和c.Price一致),完全不是按学科统计的结果。
  2. 违反only_full_group_by规则:当改为按d.Discipline_ID分组时,SELECT列表中的c.Course_Name、c.Price、c.Course_ID既不在GROUP BY子句中,也不是聚合函数(比如SUM)。在严格模式下,MySQL要求非聚合列必须和分组列有函数依赖(比如分组列是主键,对应唯一的非聚合列值),而这些课程级别的字段在同一学科下有多个不同值,MySQL无法确定返回哪一个,因此报错。

正确的SQL代码

要实现按学科统计总费用,只需要保留学科级别的字段和聚合后的总费用,分组字段对应学科的唯一标识:

SELECT 
    d.Discipline_ID,
    d.Discipline_Name,
    SUM(c.Price) AS Total_Course_Price
FROM Courses c
JOIN Discipline d ON c.Discipline_ID = d.Discipline_ID
GROUP BY d.Discipline_ID, d.Discipline_Name;

补充说明:

  • 如果Discipline_ID是Discipline表的主键,那么Discipline_Name完全依赖于Discipline_ID,此时可以只按d.Discipline_ID分组,MySQL会允许(因为函数依赖存在):
    SELECT 
        d.Discipline_ID,
        d.Discipline_Name,
        SUM(c.Price) AS Total_Course_Price
    FROM Courses c
    JOIN Discipline d ON c.Discipline_ID = d.Discipline_ID
    GROUP BY d.Discipline_ID;
    
  • 如果需要包含没有课程的学科(即该学科下无课程,总费用显示0),可以改用LEFT JOIN:
    SELECT 
        d.Discipline_ID,
        d.Discipline_Name,
        IFNULL(SUM(c.Price), 0) AS Total_Course_Price
    FROM Discipline d
    LEFT JOIN Courses c ON d.Discipline_ID = c.Discipline_ID
    GROUP BY d.Discipline_ID, d.Discipline_Name;
    

内容的提问来源于stack exchange,提问作者organza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 20:52:44