我正在尝试创建一个简单的查询,该查询将找到一个平均得分最高的人,并显示有关他们的一些基本信息。它正在检索正确的记录,但是我无法使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没有真正的经验,但是我认为在这种情况下不必发布表定义。如果我写错了,请在评论中留下注释,我将尽快更新问题。
请注意,这不是家庭作业。
有问题的项目是这样的:
`students`.`classId`
由于GROUP BY
查询为已连接表的一个或多个行生成了一行,因此该行可能对应多个students
。classId
价值。
这就是SQL要求您解决的问题:它想知道可能在中的许多项中的哪一项students
。classId
您希望它返回。这两个选择是添加一个聚合函数,例如
MIN(`students`.`classId`) AS StudentClassId
或使用students
。classId
在GROUP BY
条款中:
GROUP BY `students`.`surname`, `students`.`name`, `students`.`classId`
请注意,如果您选择后面的选项,则汇总将针对每个学生/班级,而不是针对每个学生。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句