更新:向mysql提交了一个错误:https://bugs.mysql.com/bug.php?id=100107
同样的代码在使用mysql 8.0.16运行时始终会产生预期的结果,但在mysql 8.0.20中运行时始终会产生令人困惑的结果。多个学生已经确认了在他们的机器上运行8.0.20时出现的相同错误,都是在本地使用mysql workbench运行mysql community server。
下面是生成重复行的代码。创建给定时间段内网站会话数的每月趋势的非常简单的查询:
SELECT
YEAR(website_sessions.created_at) AS yr,
MONTH(website_sessions.created_at) AS mon,
COUNT(DISTINCT website_session_id) AS session_volume
FROM website_sessions
WHERE website_sessions.created_at BETWEEN '2012-04-01' AND '2013-04-05'
GROUP BY 1,2;
上面显示的查询一致地为2012-11、2012-12、2013-1和2013-2生成了2个组、3个组和2个组。
yr, mon, session_volume
2012, 4, 3734
2012, 5, 3736
2012, 6, 3963
2012, 7, 4249
2012, 8, 6097
2012, 9, 6546
2012, 10, 8183
2012, 11, 13979
2012, 12, 9827
2012, 11, 32
2012, 12, 208
2013, 1, 3545
2012, 12, 37
2013, 1, 2820
2013, 2, 4350
2013, 1, 36
2013, 2, 2818
2013, 3, 6264
2013, 4, 1209
如果我们从count()函数内部删除distinct,则复制不会出现。下面的代码运行良好,没有重复:
SELECT
YEAR(website_sessions.created_at) AS yr,
MONTH(website_sessions.created_at) AS mon,
COUNT(website_session_id) AS session_volume
FROM website_sessions
WHERE website_sessions.created_at BETWEEN '2012-04-01' AND '2013-04-05'
GROUP BY 1,2;
或者,如果我们使用date\u format()而不是year()和month()函数来创建趋势组,我们仍然可以使用distinct而不重复。请参见下面的查询:
SELECT
DATE_FORMAT(website_sessions.created_at,'%Y') AS yr,
DATE_FORMAT(website_sessions.created_at,'%M') AS mon,
COUNT(DISTINCT website_session_id) AS session_volume
FROM website_sessions
WHERE website_sessions.created_at BETWEEN '2012-04-01' AND '2013-04-05'
GROUP BY 1,2;
3个查询中的第一个查询是唯一生成重复组的查询。第二个和第三个查询从不产生重复项。
多年来,我们一直使用相同的计数(distinct)方法,但据我所知,这种重复问题只在8.0.20版本中出现过。
查询及其输出如下所示,作为附加图像中的并排比较。
有人知道在这里使用GROUPBY时,如何在我们的group列中看到相同的值吗?或者有没有什么想法,为什么取消distinct或使用date\格式()不会产生同样的问题?
3个查询-1个重复,2个不重复
暂无答案!
目前还没有任何答案,快来回答吧!