我可以将非聚合列与group by一起使用吗?

def*_*ode 16 mysql sql group-by aggregate

您不能(不应该)将非聚合放在查询SELECT行中GROUP BY.

但是,我想访问与max相关联的非聚合之一.用简单的英语,我想要一张每种类型最老的表格.

CREATE TABLE stuff (
   id int,
   kind int,
   age int
);
Run Code Online (Sandbox Code Playgroud)

这个查询给了我以后的信息:

SELECT kind, MAX(age)
FROM stuff
GROUP BY kind;
Run Code Online (Sandbox Code Playgroud)

但它不是最有用的形式.我真的希望id与每一行相关联,以便我可以在以后的查询中使用它.

我正在寻找这样的东西:

SELECT id, kind, MAX(age)
FROM stuff
GROUP BY kind;
Run Code Online (Sandbox Code Playgroud)

这输出:

SELECT stuff.*
FROM
   stuff,
   ( SELECT kind, MAX(age)
     FROM stuff
     GROUP BY kind) maxes
WHERE
   stuff.kind = maxes.kind AND
   stuff.age = maxes.age
Run Code Online (Sandbox Code Playgroud)

看起来真的应该离开以获取这些信息而无需加入.我只需要SQL引擎在计算最大值时记住其他列.

Blo*_*ard 12

您无法获得MAX找到的行的ID,因为可能不会只有一个具有最大年龄的ID.


OMG*_*ies 6

您不能(不应该)将非聚合放在GROUP BY查询的SELECT行中.

您可以并且必须定义要为聚合函数分组的内容以返回正确的结果.

MySQL(和SQLite)以他们的无限智慧决定他们会违反规范,并允许查询接受GROUP BY子句缺少SELECT中引用的列 - 它有效地使这些查询不可移植.

看起来真的应该离开以获取这些信息而无需加入.

如果无法访问MySQL不支持的分析/排名/窗口函数,则自联接到派生表/内联视图是获得所需结果的最便携方式.