【问题标题】:isn't in GROUP BY with DAY, MONTH, YEAR [duplicate]不在 GROUP BY 中,包含 DAY、MONTH、YEAR [重复]
【发布时间】: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 数据表(文本格式)的预期输出

标签: mysql group-by


【解决方案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 你真的应该开始使用搜索引擎了...stackoverflow.com/questions/3366895/…
  • @germi 要么使用GROUP BY DATE_FORMAT(date_event,'%Y-%m'),要么只按月份和年份分别分组GROUP BY YEAR(date_event), MONTH(date_event)
猜你喜欢
  • 1970-01-01
  • 2012-03-17
  • 2016-04-16
  • 2021-12-12
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多