【问题标题】:Can't fetch a field with GROUP BY clause无法使用 GROUP BY 子句获取字段
【发布时间】:2014-05-19 14:42:23
【问题描述】:

我正在尝试创建一个简单的查询,以查找平均分最高的人并显示有关他们的一些基本信息。它正在检索正确的记录,但我无法让 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 并没有真正的经验,但我认为在这种情况下不需要发布表定义。如果我错了,请在 cmets 中留言,我会尽快更新问题。

请注意,这不是家庭作业。

【问题讨论】:

  • 在使用 group by 之前,您需要在选择列表中有列
  • @AbhikChakraborty 我已经尝试删除 CONCAT() 并单独列出列,但错误是一样的。
  • 不要使用隐式连接语法 - 并且,作为经验法则,您应该 GROUP BY 您选择的相同内容 [例如(CONCAT(s.surname, CONCAT(' ', s.name))]

标签: mysql sql


【解决方案1】:

有问题的项目是这样的:

`students`.`classId`

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

这就是 SQL 要求您解决的问题:它想知道您希望它返回 students.classId 的许多潜在项目中的哪一个。这两个选择是添加一个聚合函数,比如说

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

或在GROUP BY 子句中使用students.classId

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

请注意,如果您选择后一种选择,聚合将是每个学生/班级对,而不是每个学生。

【讨论】:

  • 如果我理解正确,它不起作用的原因是多个classId 与学生相关联。但是,当我对给定的学生(姓名+姓氏)运行查询时,只有一行有一个classIdMIN() 方法是有效的,但是如果只有一个学生记录,为什么 MySQL 不能获取该字段?
  • @Mateusz “如果只有一个学生记录,为什么 MySQL 不能获取该字段?”因为这样查询的正确性可能会根据数据而改变。想象一下,SQL 执行了您的建议,并在只有一个值要返回时返回了一个值。如果有人插入了一个新行,会产生不同的classId,会发生什么? SQL 将不得不使您“一分钟前”还在工作的查询失败。 SQL 会尽可能减少此类不愉快的意外,因此它会要求您修复查询,而不是猜测一切都会好起来。
猜你喜欢
  • 2011-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-28
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多