【问题标题】:MySQL query to return counts of rows by monthMySQL查询按月返回行数
【发布时间】:2014-04-22 23:35:03
【问题描述】:

我试图在table 中获得number of rows 中的counts 最后一个12 months,按月提供12 counts

到目前为止,我有这种非常丑陋的做法:

SELECT (
    SELECT COUNT(i.id) FROM intrusions i, devices d WHERE i.device_id = d.id AND d.primary_owner_id = '1' AND FROM_UNIXTIME(start_time/1000) like '2014-04%',
    SELECT COUNT(i.id) FROM intrusions i, devices d WHERE i.device_id = d.id AND d.primary_owner_id = '1' AND FROM_UNIXTIME(start_time/1000) like '2014-03%',
    SELECT COUNT(i.id) FROM intrusions i, devices d WHERE i.device_id = d.id AND d.primary_owner_id = '1' AND FROM_UNIXTIME(start_time/1000) like '2014-02%',
    etc
)  

这些表的设置使得1 user 可以有many devices1 device 可以有many intrusions,因此有额外的条件。

primary_owner_iddate 将使用prepared statements 动态添加到PHP 中。有没有更好的方法来写这个,它不会涉及太多重复和绑定 24 个参数?任何帮助将不胜感激

【问题讨论】:

  • 你不能做一个GROUP BY吗?

标签: php mysql sql mysqli prepared-statement


【解决方案1】:

你应该使用分组来获得这个。所以像这样。

SELECT
    CONCAT(YEAR(FROM_UNIXTIME(start_time/1000)), '-', MONTH(FROM_UNIXTIME(start_time/1000))) AS `year_month`,
    COUNT(id) AS `count`
FROM intrusions AS i
INNER JOIN devices AS d
  ON i.device_id = d.id
WHERE d.primary_owner = ?
GROUP BY `year_month`
ORDER BY `year_month` DESC
LIMIT 12

【讨论】:

  • 你太棒了,谢谢!唯一的缺点是它返回 12 个计数,无论它们是否在去年之内。它不会为没有行的特定月份返回零,而是跳过它并移至下一个。虽然不是一个大问题
【解决方案2】:

您可以使用 DATE_FORMAT 选择年份和月份,您可以使用 DATE_SUB 创建 WHERE 条件选择上个月的项目。尚未测试此语法,但应该接近正确。

这与上一个答案的思路相同,但通过首先使用更简洁的 DATE_FORMAT 并使用 DATE_SUB 自动选择过去 12 个月来改进

SELECT
  DATE_FORMAT(start_date, "%Y-%m") AS `month`,
  COUNT(`id`) AS `count`
FROM intrusions
INNER JOIN devices ON (intrusions.device_id = devices.id)
WHERE
  d.primary_owner_id = 1 AND
  DATE_SUB(CUR_DATE(), INTERVAL 12 MONTH) < start_date
GROUP BY month
ORDER BY month DESC

【讨论】:

  • 我试过这个查询,但似乎只得到了过去 12 个月的一组计数
  • 将 start_date 引用更改为 FROM_UNIXTIME(start_date/1000)。但是您最好考虑使用支持原生小数秒的 MySQL 5.6,而不是将 unix 时间存储为整数。 dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html
  • 啊,现在使用 FROM_UNIXTIME() 运行良好,并按月计算,但似乎不限于过去 12 个月?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 2020-10-05
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多