基本上,我有一个只有一个表的简单数据库(它是一个测试数据库)。 该表有4列:
我尝试做的事情非常简单(这就是我寻求帮助的原因):我希望得到名称和平均
的学生的平均。我尝试了什么:
SELECT nom, MAX(avg)
FROM (
SELECT nom, (noteOrale + noteEcrit)/2 as avg
FROM etudiant
GROUP BY nom) AS Table;
尝试此查询后,它返回名称和平均值,但平均值与名称不对应。
有人可以给我指点或解释出了什么问题吗?感谢
答案 0 :(得分:2)
使用order by
和limit
。不需要子查询:
SELECT nom, (noteOrale + noteEcrit)/2 as avg
FROM etudiant
ORDER BY avg DESC
LIMIT 1;
看起来似乎也不需要GROUP BY
,因为这些值都在一行上。
如果它们是多行,则需要GROUP BY
。
答案 1 :(得分:1)
我只会使用limit
:
SELECT nom, avg
FROM (
SELECT nom, (noteOrale + noteEcrit)/2 as avg
FROM etudiant
GROUP BY nom
) t
ORDER BY avg DESC
LIMIT 1
mysql
允许您使用聚合而不包括group by
子句中的所有非聚合列 - 因此您的查询只返回名称的任意值。
答案 2 :(得分:0)
错误的是nom
返回的值是 indeterminate 。 MAX()
聚合导致查询折叠所有行,并选出最高的avg值。那部分正在发挥作用。
但nom
返回的值来自折叠组中的某些行,不一定是avg
值最高的行。该查询基本上告诉MySQL从组中的任何行返回值nom
。
其他数据库会在查询中引发错误,并显示错误消息“SELECT列表中的非聚合不在GROUP BY中”。
非标准的MySQL特定扩展允许查询运行。 (如果我们在sql_mode中包含ONLY_FULL_GROUP_BY,则可以让MySQL更密切地遵循标准,如果我们在sql_mode中包含ONLY_FULL_GROUP_BY。如果禁用扩展,MySQL会像其他数据库一样运行,并返回错误。)
这就是你观察到的“意外”行为的原因。
(这回答了你问的问题......解释出了什么问题。)
答案 3 :(得分:-1)
只列出两个字段之和等于所有行中两个字段的最大总和的行。你不需要除以2。那只是缩放。
Select * from table
Where noteOrale + noteEcrit =
(Select Max(noteOrale + noteEcrit)
From table)
如果您还想在输出中使用计算出的avg,请将其添加到select子句中。
Select nom, noteOrale, noteEcrit,
(noteOrale + noteEcrit)/2 Avg
from table
Where noteOrale + noteEcrit =
(Select Max(noteOrale + noteEcrit)
From table)