在5.7版的MySQL中,他们添加了一个讨厌的东西,对于那些处理SQL Server的人来说,这是一个真正的headache
问题是:当您尝试对一组列执行SELECT DISTINCT行操作,并希望对另一组列执行ORDER BY操作时,MySQL会抛出一个错误。以前,在5.6版中,甚至在5.7版的某些版本中,都可以这样做,但现在它被禁止了(至少在默认情况下)。
我希望存在一些配置,一些变量,我们可以设置使其工作。但不幸的是,我不知道那个讨厌的变量。希望有人知道。
编辑
在我的案例中,这是一个典型的查询,实际工作多年(直到最后一次构建MySQL5.7):

SELECT DISTINCT a.attr_one, a.attr_two, a.attr_three, b.attr_four FROM table_one a
LEFT JOIN table_two b ON b.some_idx = a.idx
ORDER BY b.id_order

实际上,如果我现在将b.id_order包括到SELECT部分(正如MySQL建议的那样),那么我将得到的将是垃圾。

最佳答案

在大多数情况下,不同的子句可以被视为group by的特殊情况。例如,
只有“完整”组
MySQL5.7.5和更高版本实现了功能依赖性的检测。如果只启用了“按SQL分组”模式(默认情况下是这样),MySQL将拒绝选择列表、具有条件或按列表排序的查询,这些查询指的是未聚合的列,这些列既没有在group by子句中命名,也没有在功能上依赖于它们。(在5.7.5之前,MySQL没有检测到功能依赖性,默认情况下只有_full_group_by没有启用。5.7.5之前的行为描述)
如果仅禁用“完整分组依据”,则标准SQL使用“分组依据”的MySQL扩展允许“选择列表”、“具有条件”或“排序依据列表”引用未聚合的列,即使这些列在功能上不依赖于“分组依据列”。这会导致MySQL接受前面的查询。在这种情况下,服务器可以自由地从每个组中选择任何值,因此除非它们相同,否则所选的值是不确定的,这可能不是您想要的。此外,添加ORDER BY子句不会影响从每个组中选择值。结果集排序发生在选择值之后,排序方式不影响服务器选择的每个组中的哪个值。仅禁用“完全分组”主要是在您知道由于数据的某些属性,每个未在“分组依据”中命名的非聚合列中的所有值对于每个组都是相同的情况下才有用。
更多http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_only_full_group_by
对于特定的答案

SELECT DISTINCT attr_one,
            attr_two,
            attr_three,
            attr_four
FROM
  (SELECT a.attr_one,
      a.attr_two,
      a.attr_three,
      b.attr_four
   FROM table_one a
   LEFT JOIN table_two b ON b.some_idx = a.idx
   ORDER BY b.id_order) tmp

10-08 09:20
查看更多