Php MySQL查询以按月返回行数

Php MySQL查询以按月返回行数,php,mysql,sql,mysqli,prepared-statement,Php,Mysql,Sql,Mysqli,Prepared Statement,我试图获得过去12个月表中行数的计数,按月计算12个计数 到目前为止,我有一种非常丑陋的方法: 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 intrusi

我试图获得过去12个月
行数
计数,按月计算
12个计数

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

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个用户
可以拥有
多个设备
1个设备
可以拥有
多个入侵
,因此需要额外的条件


主要所有者id
日期
将使用
准备语句
PHP
中动态添加。有没有一种更好的方式来写出来,而不需要太多的重复和绑定24个参数?任何帮助都将不胜感激

您应该使用分组来获得此信息。像这样

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

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

这与上一个答案的思路相同,但通过首先使用更简洁的DATE_格式并使用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
选择
日期格式(开始日期,“%Y-%m”)为“月”,
将(`id`)计数为`COUNT`
来自入侵
上的内部连接设备(intrusions.device\u id=devices.id)
哪里
d、 主所有者id=1和
日期(当前日期(),间隔12个月)<开始日期
按月分组
按月订购说明

你就不能按
分组吗?你太棒了,谢谢!唯一的缺点是它返回12个计数,不管它们是否在去年内。它不会在没有行的特定月份返回零,而是跳过它并移动到下一个月份。虽然我尝试了这个查询,但似乎只得到了过去12个月的1组计数。将开始日期引用更改为FROM\u UNIXTIME(开始日期/1000)。但是你最好考虑使用MySQL 5.6的本地分数秒支持,而不是将UNIX时间存储为整数。dev.mysql.com/doc/refman/5.6/en/fractional-seconds.htmlAh现在使用FROM_UNIXTIME()可以很好地工作,并按月计数,但似乎不限于过去12个月?