由于“人人都知道”,您无法在GROUP BY
中返回未分组的非聚合列,换句话说,“向我提供最高薪水的员工的ID,姓名和地址每个部门。“当然这不是真的:http://dev.mysql.com/doc/refman/5.1/en/group-by-hidden-columns.html但这包含一个相当不祥的警告:
服务器可以自由选择每个组中的任何值,因此除非他们 如果是相同的,所选择的值是不确定的。
MySQL还有另一篇关于这个问题的文章:http://dev.mysql.com/doc/refman/5.0/en/example-maximum-column-group-row.html但是推荐的技术并没有真正利用所有隐藏的列。 Kasey Speakman的那篇文章中有评论,他建议使用有序的子查询,如下所示:
select deptno, emp_id, address, name from
(select * from emp order by salary desc)
group by deptno
我的问题是:a)我可以安全地依赖MySQL从每个组中选择“第一”行,因为子查询是有序的,并且b)一般而言,假设适当的索引,这可能比比方说,同一篇文章中提到的LEFT JOIN技术?
答案 0 :(得分:1)
最近在这里讨论了类似的问题:SQL: What is the default Order By of queries?
但是,尽管如此,我认为排名查询是MySQL中查询的示例,依赖于预测顺序(通过使用特定索引预测)非常有用。
查看我对以下问题的回答:Retrieving the last record in each group
这是你问题的答案:
是的,有时你可以在知道引擎和使用的索引时依赖订单,虽然它通常不被友好接受
当每个组中有很多项时,LEFT JOIN解决方案可能需要很长时间才能执行,因此依赖裸索引可能几乎成为唯一的解决方案。但是解决方案不应该生成巨大的中间临时表。
但是您的查询:
select deptno, emp_id, address, name from
(select * from emp order by salary desc)
group by deptno
是最糟糕的想法,因为它会生成表的无索引副本并对其进行操作而不使用任何优化。