在我的J2EE Web应用程序中,我需要生成一个条形图,表示系统中具有特定alerts
的users
的百分比。 (编辑 - 我忘了提及,图表只处理与每个用户的第一个situation
相关的警报,因此min(date)
)。大量sum()的SQL性能
简化我的数据库架构的(但结构上类似的)版本如下:
users { id, name }
situations { id, user_id, date }
alerts { id, situation_id, alertA, alertB }
users
哪里到situations
是1-n,以及situations
到alerts
是1-1。
我省略了数据类型,但警报(alertA和B)是布尔值。在我的实际的情况下,有很多这样的警报(30-ish)。
到目前为止,这是我想出了:
select sum(alerts.alertA), sum(alerts.alertB)
form alerts, (
select id, min(date)
from situations
group by user_id) as situations
where situations.id = alerts.situation_id;
然后
select count(users.id) from users;
这个理想似乎远没有把这些款项。
你的建议/意见,就如何改进的查询将非常感激(或者也许我需要重新考虑我的数据库架构)...
感谢,
安东尼
PS。我也在考虑在警报表更新时使用触发器刷新图表特定的表格,但我想这是另一个查询的主题(如果事实证明有问题)。
我对此表示歉意,我忘了提及我只对与第一个“情况”相关的'alerts' - 因此'min(date)'感兴趣。我已经相应修改了我原来的问题。 – 2014-11-01 10:20:20
我实际上已经设想将警报重构为每行一个警报模型。在Web应用程序方面,这意味着我的'Alerts'类只包含一个Alert项目列表,我需要做一些重新布线。我的isAlertA()方法只会返回一个contains()或其他的东西 - 没有特别的问题。在我的真实世界的应用程序中,“情境”也包含许多计算出来的指标。你认为这些会从类似的待遇中受益吗?非常感谢 – 2014-11-01 10:31:54
我更新了关于'第一种情况'问题的答案。我希望这有助于! – wolfgangwalther 2014-11-01 13:38:45