繁体   English   中英

针对不同日期运行 SQL 查询的最佳方式

[英]Best way to run a SQL query for different dates

我有一个 PHP 应用程序,它记录连接到服务器的各种设备的会话。 数据库有一个表session ,其中包含列device_idstart_dateend_date 要知道在给定日期连接的设备数量,我可以使用请求:

SELECT COUNT(DISTINCT device_id)
FROM session
WHERE :date >= start_date AND (:date <= end_date OR end_date IS NULL)

其中:date作为参数传递给准备好的语句。

这工作正常,但如果我想知道一年中每一天的设备数量,则需要运行 365 个查询,而且我担心事情会变得非常缓慢。 在 PHP 中的日期进行迭代感觉不对,在我看来应该有一种更优化的方法来执行此操作,只需对数据库进行一次查询。

  1. 是否可以通过单个查询执行此操作?

  2. 它实际上会比在 PHP 运行多个查询中迭代日期更快吗?


编辑以回答评论:

  • 我确实想要每一天的数字(例如绘制图表),而不仅仅是总和

  • 数据类型是 DATE

如果我理解正确,那么您首先需要一个日期表,例如:

create table dates(dt date);
insert into dates(dt) values
('2001-01-01'),
('2001-01-02'),
...
('2100-12-31')

并使用这样的查询:

select dates.dt, count(session.device_id)
from dates
join session on start_date <= dates.dt and (dates.dt <= end_date or end_date is null)
-- change to left join to include zero counts
where dates.dt >= :date1 and dates.dt <= :date2
group by dates.dt

PS:既然你提到了图表,我可能会补充说,可以避免使用日期表。 但是,结果将仅包含设备数量发生变化的日期。 图表 API 通常接受此类数据,但仍会为介于两者之间的所有日期创建数据点。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM