SQL意外返回

时间:2016-10-01 16:33:20

标签: mysql sql phpmyadmin easyphp

基本上,我有一个只有一个表的简单数据库(它是一个测试数据库)。 该表有4列:

  • ID
  • 名称
  • OralGrade
  • WrittenGrade

我尝试做的事情非常简单(这就是我寻求帮助的原因):我希望得到名称平均

的学生的平均

我尝试了什么:

SELECT nom, MAX(avg) 
    FROM ( 
        SELECT nom, (noteOrale + noteEcrit)/2 as avg 
        FROM etudiant 
        GROUP BY nom) AS Table; 

尝试此查询后,它返回名称平均值,但平均值与名称不对应。

有人可以给我指点或解释出了什么问题吗?感谢

4 个答案:

答案 0 :(得分:2)

使用order bylimit。不需要子查询:

    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)