简单的 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 配置及简单测试