无法使用GROUP BY子句获取字段

时间:2014-05-19 14:42:24

标签: mysql sql

我正在尝试创建一个简单的查询,该查询将找到具有最高平均分数的人并显示有关它们的一些基本信息。它正在检索正确的记录,但我无法使MySQL显示students.classId字段。我在LibreOffice Base中遇到的错误是

  

不在聚合函数或group by子句中。

查询错误:

SELECT CONCAT(`students`.`surname`, CONCAT(' ', `students`.`name`)) AS `Student`, 
    AVG(CAST(`marks`.`mark` AS DECIMAL (10, 2))) AS `Average`,
    `students`.`classId` 
FROM `students`, `marks`, `subjects` 
WHERE `marks`.`subjectId` = `subjects`.`subjectId` 
    AND `students`.`studentId` = `marks`.`markId`
GROUP BY `students`.`surname`, `students`.`name`
ORDER BY `Average` DESC LIMIT 1;

无错误查询:

SELECT CONCAT(`students`.`surname`, CONCAT(' ', `students`.`name`)) AS `Student`, 
    AVG(CAST(`marks`.`mark` AS DECIMAL (10, 2))) AS `Average`
FROM `students`, `marks`, `subjects` 
WHERE `marks`.`subjectId` = `subjects`.`subjectId` 
    AND `students`.`studentId` = `marks`.`markId`
GROUP BY `students`.`surname`, `students`.`name`
ORDER BY `Average` DESC LIMIT 1;

我对SQL并不熟悉,但我认为在这种情况下不需要发布表定义。如果我错了,请在评论中留言,我会尽快更新问题。

请注意,不是作业。

1 个答案:

答案 0 :(得分:3)

有问题的项目是:

`students`.`classId`

由于GROUP BY查询为连接表的一行或多行生成单行,因此该单行可能对应多个studentsclassId值。

这就是SQL要求您修复的内容:它想知道您希望它返回的studentsclassId中可能有多少项。这两个选择是添加一个聚合函数,比如说

MIN(`students`.`classId`) AS StudentClassId

或在students子句中使用classIdGROUP BY

GROUP BY `students`.`surname`, `students`.`name`, `students`.`classId`

请注意,如果您使用后面的选项,则聚合将是每个学生/班级对,而不是每个学生。