执行计算SQL

时间:2015-06-09 08:29:21

标签: mysql

我试图从一个MySQL表中获取信息,对这些数据执行一系列计算,然后将结果放在第二个MySQL表中。这样做的最佳方法是什么(即在MySQL本身,使用python等)?

我对模糊的道歉,我会试着更具体。表1列出了我班上每个人都吃的每餐,因此每餐都是主食,其他栏目包括人和卡路里数。表2的主要关键是人,另一列是这个人吃掉的总卡路里的百分比,超出了整个班级的卡路里。另一栏是该人在该班级中的性别总卡路里的百分比。每天,我想获取新的饮食信息,并使用它来更新表2中的百分比。(感谢您的帮助!)

2 个答案:

答案 0 :(得分:0)

一种可能的解决方案可能是您使用后面的复杂SELECT查询创建ViewMaterialized View

Materialized View也可能是另一种选择,正如您所写,您希望每天都重新查询/刷新这些结果。

如果您需要对这些表执行更多高级操作,可以创建Stored procedure并在需要其数据时调用它。

注意:你不能进一步工作(例如:不能从一个选择加入它的结果集中调用它)与程序结果集而不是说一个临时表。

答案 1 :(得分:0)

确定计算可以在SQL中完成(百分比肯定是可以的),你有一些选择。

第一个也是学术上正确的选择,根本不是将它存储在表格中。 normalization的原则之一是您不存储重复值或计算值 - 而是根据需要计算它们。

这不仅仅是一个学术问题 - 它避免了许多愚蠢的错误和异常,这意味着您的数据始终是最新的 - 您无需等待计算查询运行,然后才能使用数据

如果计算是非平凡的和/或业务域的重要部分,通常的做法是创建一个数据库view,它在查询时表现得像一个表,但实际上是在运行中计算的。这意味着业务逻辑封装在视图中,而不是在多个查询中重复。你可以进一步,具体化的观点等 - 但基本原则是相同的。

在某些情况下,如果数据量很大,或计算耗时,或者您的计算很难嵌入到单个SQL语句中,那么通常会创建“聚合表” - 这就是你在暗示。您可以通过(计划)查询或使用数据库触发器填充这些表。

但是,聚合表是最后的手段 - 它们使得很多的解决方案难以维护和调试 - 如果数据错误,您没有一个查询要调试,那么必须始终遵循逻辑链。

假设你是一个几十人的班级,并报告不到一千万年的饭菜,任何现代的RDBMS都可以用毫秒计算这个报告 - 实际上没有必要将它存储在聚合表中。

相关问题