在MySQL 5.7.17中使用order by和math函数选择count distinct时,结果不正确

在MySQL 5.7.17中使用order by和math函数选择count distinct时,结果不正确,mysql,group-by,distinct,Mysql,Group By,Distinct,我有一个名为temp的简单表,其中有三列和以下数据: # c1 c2 v 1 1 'a' 1 2 'b' 1 1 'b' 1 2 'a' 我运行查询: SELECT t01.c1, t01.c2, COUNT(DISTINCT v) AS cnt FROM ( SELECT FLOOR(c1) AS c1, FLOOR(c2) AS c2, v FROM

我有一个名为
temp
的简单表,其中有三列和以下数据:

# c1  c2  v
  1   1  'a'
  1   2  'b'
  1   1  'b'
  1   2  'a'
我运行查询:

SELECT
    t01.c1,
    t01.c2,
    COUNT(DISTINCT v) AS cnt
FROM
(
    SELECT 
        FLOOR(c1) AS c1,
        FLOOR(c2) AS c2,
        v
    FROM 
        temp
)   AS t01
GROUP BY
    t01.c1,
    t01.c2
ORDER BY
    cnt DESC
这将返回以下内容:

# c1, c2, cnt
   1,  1,  2
   1,  2,  2
但实际上它返回的是:

# c1, c2, cnt
   1,  1,  1
   1,  2,  1
   1,  1,  1
   1,  2,  1
仅当它包含数学函数floororder bygroup bycount distinct且结果不正确时,这就很奇怪了-它不会对数据进行分组


这是5.7.17版中的MySQL错误吗?

它刚刚在MySQL 5.6上试用过,而且很有效。等等 在MySql 5.7中,它没有

因此,它可能是MySql 5.7的一部分,正如您所想

根据以下内容(MySQL 5.7中不推荐的功能)

默认情况下,GROUP BY隐式排序(即,在没有ASC的情况下 或DESC指示符),但通过在中排序依赖于隐式组 MySQL 5.7已被弃用。实现分组的特定排序顺序 结果,最好使用生成给定的排序顺序,使用 按列分组的显式ASC或DESC指示符,或提供 按条款排序。GroupBySorting是一个MySQL扩展,可能会发生变化 在未来的版本中;例如,使 优化器以其认为最合适的方式对分组进行排序 高效且可避免排序开销


更新

我为你尝试了其他有效的方法:

SELECT
    t01.c1,
    t01.c2,
    count(v) AS cnt
FROM
(
    SELECT 
        DISTINCT v as v,
        FLOOR(c1) AS c1,
        FLOOR(c2) AS c2

    FROM 
        temp
)   AS t01
GROUP BY
    t01.c1,
    t01.c2
ORDER BY
    cnt DESC
这是我的create语句:

CREATE TABLE temp
    (`c1` int, `c2` int, `v` varchar(5))
;

INSERT INTO temp
    (`c1`, `c2`, `v`)
VALUES
    (1, 1, '''a'''),
    (1, 1, '''a'''),
    (1, 2, '''b'''),
    (1, 1, '''b'''),
    (1, 1, '''c'''),
    (1, 2, '''a''')
;
结果是:

是的,这是一个与将派生表(FROM子句中的
子查询)合并到外部查询相关的错误。请在上提交一个bug

解决方法:

  • 设置
    optimizer\u switch='derived\u merge=off'
  • 在子查询中添加一个
    LIMIT
    子句。这将防止它被合并到外部查询中
  • 手动将子查询与外部查询合并:


你的问题太长了。请仅使用一个或两个查询来提问。请发布表定义,因为列类型可能很重要。还有insert语句,这样我可以在这里正确设置它。考虑设置SQLFIDLE?请提供
EXPLAIN-SELECT…
EXPLAIN-FORMAT=JSON-SELECT…
。提交一个bug,指出它似乎是5.7中的回归。在此处发布错误编号。看起来这是您的问题,文档参考仅解释了对于担保订单,您需要定义一个
orderby
子句。所以我认为这是不相关的。或者你呢?是的,我认为这是相关的,因为这恰恰是描述问题的部分的变化。还有现在的组默认排序(这也解释了为什么没有排序它会工作)现在的组默认排序(这也解释了为什么没有排序它会工作)-我不在这里抱怨,但我们会看看社区是怎么想的。我的意思是他们在这里改变了一些东西,这可能会导致错误提示,即隐式排序已弃用,而不是删除。(它在8.0中被删除。)无论如何,隐式排序在这里不适用,因为有一个(显式)ORDERBY子句。
SELECT 
  FLOOR(c1) AS g1, 
  FLOOR(c2) AS g2, 
  COUNT(DISTINCT v) AS cnt   
FROM temp
GROUP BY g1, g2
ORDER BY cnt DESC;