不在 GROUP BY 中,包含 DAY、MONTH、YEAR [重复]

Posted

技术标签:

【中文标题】不在 GROUP BY 中,包含 DAY、MONTH、YEAR [重复]【英文标题】:isn't in GROUP BY with DAY, MONTH, YEAR [duplicate] 【发布时间】:2018-12-18 05:38:11 【问题描述】:

我在使用 ONLY_FULL_GROUP_BY 模式时遇到了麻烦(我不想这样做,但我不得不这样做)。 问题是这需要我在 group by 子句中包含一列。这是我需要选择的列(它是时间戳列),但需要按“日、月和年”分组。 像这样:

SELECT COUNT(id) AS howmuch, date_event 
FROM mytable AS st 
WHERE date_event BETWEEN SUBDATE(CURDATE(), 7) AND NOW() 
GROUP BY DAY(date_event), MONTH(date_event), YEAR(date_event) 
ORDER BY date_event

但这会引发错误:

'mydb.st.date_event' isn't in GROUP BY

因为 date_event 不在 GROUP BY 中,因为不可能。 如果我将 date_event 添加到分组依据,则查询有效,但从逻辑上讲,它不会返回我想要的内容(我需要知道该数据库表中有多少条目,按天分组。

任何提示如何实现这一点?

谢谢!!

【问题讨论】:

如果您按日、月、年对数据进行分组,您不应该也以这种方式选择该数据吗? 如果您添加示例数据,请将其放在 sqlfiddle.com 或 db-fiddle.com 上会更好。还提供基于示例数据的 ascii 数据表(文本格式)的预期输出 【参考方案1】:

根据定义,一天不是某种独立的抽象,而是一个月和一年。因此,您只需在查询中选择日、月和年:

SELECT
    DAY(date_event),
    MONTH(date_event),
    YEAR(date_event),
    COUNT(id) AS howmuch
FROM mytable
WHERE date_event BETWEEN SUBDATE(CURDATE(), 7) AND NOW() 
GROUP BY DAY(date_event), MONTH(date_event), YEAR(date_event) 
ORDER BY YEAR(date_event), MONTH(date_event), DAY(date_event);

但我们可以通过按DATE(date_event) 分组来使其更简洁:

SELECT
    DATE(date_event),
    COUNT(id) AS howmuch
FROM mytable
WHERE date_event BETWEEN SUBDATE(CURDATE(), 7) AND NOW() 
GROUP BY DATE(date_event)
ORDER BY DATE(date_event);

【讨论】:

是的,这似乎可以解决问题..!非常感谢! 只是快速跟进...我需要构建一个非常相似的查询,但在这种情况下,分组依据不是“按日期”,而是“按月”。还有同样的查询,按年份分组。是否有等效于“DATE()”但一个月的? @germi 你真的应该开始使用搜索引擎了...***.com/questions/3366895/… @germi 要么使用GROUP BY DATE_FORMAT(date_event,'%Y-%m'),要么只按月份和年份分别分组GROUP BY YEAR(date_event), MONTH(date_event)

以上是关于不在 GROUP BY 中,包含 DAY、MONTH、YEAR [重复]的主要内容,如果未能解决你的问题,请参考以下文章

#1055 - SELECT 列表的表达式不在 GROUP BY 子句中,并且包含非聚合列,这与 sql_mode=only_full_group_by 不兼容

ORDER BY 子句的表达式 #1 不在 GROUP BY 子句中,并且包含非聚合列

MySQL 5.0.12 - 列表不在 GROUP BY 子句中并且包含非聚合列?

在 SQL 中选择不在 Group By 中的列

SQLSTATE [42000]:语法错误或访问冲突:1055 SELECT 列表的表达式 #3 不在 GROUP BY 子句中并且包含非聚合

表达式不在聚合或 GROUP BY 列中 异常