简单的 MySQL 5.7 only_full_group_by 计数

Posted

技术标签:

【中文标题】简单的 MySQL 5.7 only_full_group_by 计数【英文标题】:Simple MySQL 5.7 only_full_group_by count 【发布时间】:2017-05-24 10:04:30 【问题描述】:

我读过http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html

和http://rpbouman.blogspot.nl/2014/09/mysql-575-group-by-respects-functional.html

但在尝试重写简单的 MySQL 查询时仍然出错...

表:Event_Visitors

Event_ID       |     User_ID     |user_level |rsvp_status | updated_time
foreign int(11)| foreign int(11) | int(3)    |  int(3)    | timestamp (onupdate)

这是我的表,有两个外键。 现在我想执行以下查询:

SELECT min(ev.Event_ID), ev.User_ID, ev.rsvp_status, ev.updated_time, count(*) 
FROM EVENT_VISITORS ev
GROUP BY ev.User_ID
ORDER BY ev.updated_time DESC

得到错误:

包含与功能无关的非聚合列“markusp.ev.updated_time”

我知道将 ev-updated_time 添加到 group by 子句可以解决问题。但我想计算行数,而不是显示用户的每一行。 (计算用户参加的所有活动)。

添加 min(ev.Event_ID) 或 any_value(ev.Event_ID) 并不能解决问题。

我不明白。我的意思是更新时间取决于 User_ID + Event_ID 所以如果我将 User_ID 添加到分组依据和 MIN(Event_ID) 应该可以吗?

【问题讨论】:

【参考方案1】:

为什么不直接写你想要的查询呢?也就是说,通过将所有非聚合列放在group by 中,具体说明聚合和未聚合的列。一种方法是:

SELECT min(ev.Event_ID), ev.User_ID, ev.rsvp_status, ev.updated_time, 
       count(*) 
FROM EVENT_VISITORS ev
GROUP BY ev.User_ID, ev.rsvp_status, ev.updated_time
ORDER BY ev.updated_time DESC;

或者您可能打算这样做:

SELECT min(ev.Event_ID), ev.User_ID,  count(*) 
FROM EVENT_VISITORS ev
GROUP BY ev.User_ID
ORDER BY MAX(ev.updated_time) DESC;

【讨论】:

如果我将所有非聚合列放在 group_by 中,它不会被“仅”User_ID “分组”。在您上面的查询中,我将计算按 rsvp 和更新时间分组的每个用户。我想要的是用户参加的所有活动,例如(不同的 user_id)并计算行数。 P.S.第二次查询失败原因是order by子句中的MAX(ev.updated_time)。 @Markus 。 . .由于ORDER BY 中的MAX(),第二个查询应该可以正常工作。 Mhh 我的 sql 不喜欢该查询:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 4 行中的“ORDER BY MAX(ev.updated_time) DESC”附近使用正确的语法。但是我知道问题出在哪里,按更新时间排序,而它不在 GROUP_BY 中就像你说的。删除它正在工作。但它不是按 MAX(updated_time) 排序的... 您的查询非常有效。 GROUP BY 子句后只有逗号错误。非常感谢:)

以上是关于简单的 MySQL 5.7 only_full_group_by 计数的主要内容,如果未能解决你的问题,请参考以下文章

简单的 MySQL 5.7 only_full_group_by 计数

Mysql主从复制—5.7 gtid 双主 + Keepalived 配置及简单测试

Mysql主从复制—5.7 gtid 双主 + Keepalived 配置及简单测试

Mysql高可用—5.7 gtid 主从 + orchestrator 配置及简单测试

Mysql高可用—5.7 gtid 主从 + orchestrator 配置及简单测试

Mysql高可用—5.7 gtid 主从 + orchestrator 配置及简单测试