Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在MySQL中选择DISTINCT和ORDER BY_Mysql - Fatal编程技术网

在MySQL中选择DISTINCT和ORDER BY

在MySQL中选择DISTINCT和ORDER BY,mysql,Mysql,似乎在MySQL的5.7版中,他们添加了一个讨厌的东西,对于那些处理SQL Server的人来说,这是(或仍然是)一个真实的东西 问题是:当您尝试为一组列选择不同的行,并希望按另一组列排序时,MySQL会抛出一个错误。以前,在版本5.6中,甚至在版本5.7的某些版本中,您可以这样做,但现在它被禁止(至少在默认情况下) 我希望存在一些配置,一些变量,我们可以设置使其工作。但不幸的是,我不知道那个讨厌的变量。我希望有人知道这一点 编辑 在我的例子中,这是一个典型的查询,实际运行了多年(直到最后一次构

似乎在MySQL的5.7版中,他们添加了一个讨厌的东西,对于那些处理SQL Server的人来说,这是(或仍然是)一个真实的东西

问题是:当您尝试
为一组列选择不同的
行,并希望
按另一组列排序时,MySQL会抛出一个错误。以前,在版本5.6中,甚至在版本5.7的某些版本中,您可以这样做,但现在它被禁止(至少在默认情况下)

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

编辑

在我的例子中,这是一个典型的查询,实际运行了多年(直到最后一次构建MySQL 5.7):


事实上,如果我现在将
b.id\u order
包含在
SELECT
部分(正如MySQL建议的那样),那么我将得到的将是垃圾。

我已经阅读了您提到的链接上的帖子,看起来已经给出了抛出错误的原因和如何避免错误的清晰解释

在您的情况下,您可能需要尝试以下方法(当然不需要测试):


您应该选择是使用
orderbymax(b.id\u-ORDER)
,还是使用
orderbymin(b.id\u-ORDER)
或其他聚合函数

在大多数情况下,DISTINCT子句可以被视为GROUPBY的特例。比如说,

仅限组员

MySQL 5.7.5及以上版本实现了功能依赖性检测。如果启用了ONLY_FULL_GROUP_BYSQL模式(默认情况下),MySQL将拒绝select list、HAVING condition或ORDER BY list引用的未聚合列的查询,这些列既不在GROUP BY子句中命名,也不依赖于GROUP BY子句。(在5.7.5之前,MySQL不会检测到功能依赖性,并且默认情况下只启用“完整”组。有关5.7.5之前行为的描述,请参见

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

它在MySQL中不起作用。如果我在MySQL中没有弄错的话,就不能保证结果集是第一个
ORDER
ed,然后是
GROUP
ed
BY
。或者,正如developerCK所说,“此外,添加ORDER by子句不能影响从每个组中选择值。结果集排序发生在选择值之后,排序依据不影响服务器在每个组中选择的值。“我知道。我已经通过将
sql\u模式设置为
,禁用了
仅完整组”
”“
my.cnf
中的
,但是
DISTINCT
ORDER BY
的这个问题并没有解决。您的sql版本是什么,您尝试过最大排序长度吗?版本是5.7.10。尝试此变量是什么意思?在比较数据值时,服务器仅使用第一个最大排序长度字节。这意味着,如果值仅在第一个max_sort_length字节之后不同,则无法可靠地在GROUP BY、ORDER BY或DISTINCT中使用这些值。要解决此问题,请增加变量值。hello@Jacobian,我正在使用一种可能的解决方案更新我的答案,以便使用distinct进行排序。请检查,并让我知道它是否有效。这是实际查询吗?是的,这是一个真实世界的查询。有完全相同的问题,意外地从5.2升级到5.7:(
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
GROUP BY a.attr_one, a.attr_two, a.attr_three, b.attr_four 
ORDER BY max(b.id_order)
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