【问题标题】:Simple MySQL 5.7 only_full_group_by count简单的 MySQL 5.7 only_full_group_by 计数
【发布时间】: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) 应该可以吗?

【问题讨论】:

    标签: sql count mysql-5.7


    【解决方案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 子句后只有逗号错误。非常感谢:)
    猜你喜欢
    • 2017-06-19
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    • 2019-05-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多