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,我刚刚意识到我还没有阐明其中的主要思想。你的问题让我找到了一个基于同样想法的更简单的解决方案。我会在那里更新我的答案。