当前位置:  开发笔记 > 后端 > 正文

在MySQL中选择DISTINCT和ORDER BY

如何解决《在MySQL中选择DISTINCT和ORDERBY》经验,为你挑选了1个好方法。

看起来在MySQL的5.7版本中,他们添加了一个令人讨厌的东西,对于那些处理SQL Server的人来说,这是一个真正令人头痛的问题.

问题是:当你尝试SELECT DISTINCT一组列的行并想要ORDER BY另一组列时,MySQL会抛出一个错误.以前,在5.6版本中甚至在5.7版本的某些版本中你可以这样做,但现在禁止它(至少在默认情况下).

我希望存在一些配置,我们可以设置一些变量来使其工作.但不幸的是,我不知道这个讨厌的变量.我希望有人知道.

编辑

这是我的案例中的一些典型查询,这些查询在字面上工作多年(直到MySQL 5.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建议的那样),那么我将得到的将是垃圾.



1> developerCK..:

在大多数情况下,DISTINCT子句可以视为GROUP BY的特例.例如,

ONLY_FULL_GROUP_BY

MySQL 5.7.5及更高版本实现了对功能依赖的检测.如果启用了ONLY_FULL_GROUP_BY SQL模式(默认情况下是这样),MySQL拒绝查询,其中选择列表,HAVING条件或ORDER BY列表引用既未在GROUP BY子句中命名也未在功能上依赖于它们的非聚合列.(在5.7.5之前,MySQL不检测功能依赖性,默认情况下不启用ONLY_FULL_GROUP_BY.有关5.7.5之前行为的描述)

如果禁用ONLY_FULL_GROUP_BY,则对GROUP BY的标准SQL使用的MySQL扩展允许选择列表,HAVING条件或ORDER BY列表引用非聚合列,即使这些列在功能上不依赖于GROUP BY列.这导致MySQL接受前面的查询.在这种情况下,服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选的值是不确定的,这可能不是您想要的.此外,添加ORDER BY子句不会影响每个组中值的选择.选择值后会发生结果集排序,而ORDER BY不会影响服务器选择的每个组中的值.禁用ONLY_FULL_GROUP_BY主要是因为您知道由于数据的某些属性,每个未在GROUP 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


我知道.我已经通过在`my.cnf`中将`sql_mode`设置为``"`来禁用`ONLY_FULL_GROUP_BY`,但是这个'DISTINCT`和`ORDER BY`的问题并没有解决.
推荐阅读
罗文彬2502852027
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有