MySQL中组最大值的可接受技术
正如“每个人都知道”所说,您不能返回MySQL中组最大值的可接受技术,mysql,sql,Mysql,Sql,正如“每个人都知道”所说,您不能返回GROUP BY中未分组、未聚合的列,换句话说,“给我每个部门中工资最高的员工的ID、姓名和地址”。当然这并不完全正确:但这包含一个相当不祥的警告: 服务器可以从每个组中自由选择任何值,因此除非 如果相同,则选择的值是不确定的 MySQL还有一篇关于这个问题的文章:但是这里推荐的技术实际上并没有利用所有隐藏列。Kasey Speakman在那篇文章中发表了一条评论,他建议使用有序子查询,如下所示: select deptno, emp_id, address,
GROUP BY
中未分组、未聚合的列,换句话说,“给我每个部门中工资最高的员工的ID、姓名和地址”。当然这并不完全正确:但这包含一个相当不祥的警告:
服务器可以从每个组中自由选择任何值,因此除非
如果相同,则选择的值是不确定的
MySQL还有一篇关于这个问题的文章:但是这里推荐的技术实际上并没有利用所有隐藏列。Kasey Speakman在那篇文章中发表了一条评论,他建议使用有序子查询,如下所示:
select deptno, emp_id, address, name from
(select * from emp order by salary desc)
group by deptno
我的问题是:a)由于子查询是有序的,我可以安全地依靠MySQL从每个组中选择“第一”行吗?b)一般来说,假设使用适当的索引,这是否比同一篇文章中提到的左连接技术的性能更好?最近在这里讨论了一个类似的问题: 但是,尽管如此,我认为排名查询是MySQL中查询的一个例子,在MySQL中,依赖预测顺序(使用特定索引预测)是非常有用的 请看我对以下问题的回答: 以下是对您的问题的回答:
select deptno, emp_id, address, name from
(select * from emp order by salary desc)
group by deptno
这可能是最糟糕的想法,因为它生成表的未索引副本,并在其上操作,而不使用任何优化 我的例子取自那篇文章中的例子,这就是为什么我要问这个问题。在我的实际情况中,内部查询将有一个
where
子句,该子句将使用索引选择相当小的数据子集。但我所排序的列(在普通情况下将调用MAX
)确实没有索引。@Dan,您的解决方案最多应该返回子查询中行的ID,您应该再次将其与表连接以获取其余数据。我明白了。您的解决方案看起来很有趣,但我还不太明白-我以前从未在查询中处理过变量赋值问题。@Dan,我刚刚意识到我还没有阐明其中的主要思想。你的问题让我找到了一个基于同样想法的更简单的解决方案。我会在那里更新我的答案。