mysql - 如何在Mysql中按天计数

标签 mysql sql innodb

此表包含按时间戳记的小时订单数:

订单

id, created_at, items
1, 1484827200, 5
2, 1484830800, 10
3, 1484913600, 10

//如何获取每天的元素数量? 类似的东西:

2016-01-19, 15
2016-01-20, 10

我的查询:

SELECT sum(items)
FROM orders
GROUP BY EXTRACT(DAY_HOUR FROM created_at)

不正确。

SELECT day(from_unixtime(created_at)), sum(items)
FROM orders
GROUP BY day (from_unixtime(created_at))

太慢了。

最佳答案

1。添加一个名为“Day”的字符串列,该列也被编入索引

理想情况下,您应该包含一个日期列,并更新所有行。将日期时间存储为 unix 时间戳并每次都转换它们会导致以下问题:

  • 您必须为每一行运行 from_unixtime,然后还要提取日期。
  • 您正在牺牲可能与索引列一起正常工作的任何类型的优化。 Unix 时间戳数字,与日期相比,本质上是橙子化。

因此,如果此查询很关键,我会添加一个 day 列,并保存日期和时间戳以获得最大速度。还要为您的日期列编制索引。

2。实验

  • 尝试使用别名表,然后进行分组。我有一种感觉,优化器以这样一种方式进行优化,它可能不会产生任何不同,但您可能会运行 from_unixtime 2 次而不是一次(这需要检查):

    选择 天, SUM(项目) 来自(选择 DAY(from_unixtime(created_at)) 作为一天, 项目 FROM 订单) AS temp GROUP BY temp.day

我不确定 from_unixtime 转换是否在 group by 中再次运行。

关于mysql - 如何在Mysql中按天计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41760975/

相关文章:

mysql - 触发器中的变量对我不起作用

PHP 字符串查找和替换直到最后一个实例

mysql - 将base64编码的数据存储为BLOB或TEXT数据类型

java - 将数据库引擎从 MyIsam 更改为 innoDB 时出错

mysql - 当格式为 Month YYYY 时计算以月为单位的日期差异

javascript - 使用 Sequelize 的多对多关系的简单示例

python - 有没有用 Django 制作的 sql 管理面板? - Django

mysql - 我需要更改数百篇 wordpress 文章中的 url。帮助?

mysql - 我应该在删除行之前每次都使用 MySQL TRIGGER 语句吗?

mysql - 在没有 information_schema 的情况下确定 InnoDB FK 约束