如何使用基于YYYY-MM日期选择的另一个表中的值执行迭代计算并将其写回第一个表?

时间:2011-04-06 13:56:35

标签: php mysql database date relational

昨天开始学习PHP和MySQL,并设法创建两个表,插入行,然后使用各种不同的分组在网页上显示这些数据。现在我需要根据两个表中的数据进行计算,并将结果写回其中一个表。

我正在尝试使用与表B中的日期范围相关联的一系列值来弄清楚如何使用表A中的日期对行执行等式。这两个日期的格式为YYYY-MM- DD,但这些日子大多不匹配,所以我需要在这个月匹配。

这是我的两张桌子:

表A(用户)

+----+----------+------------+-------------+
| id | username | start-date | bench-value |
+----+----------+------------+-------------+
|  1 | tim      | 2010-03-04 |             |
+----+----------+------------+-------------+
|  2 | jim      | 2010-05-30 |             |
+----+----------+------------+-------------+
|  3 | fred     | 2010-06-12 |             |
+----+----------+------------+-------------+
|  4 | sam      | 2010-08-16 |             |
+----+----------+------------+-------------+
|  5 | jane     | 2010-10-21 |             |
+----+----------+------------+-------------+
|  6 | ella     | 2010-10-21 |             |
+----+----------+------------+-------------+
|  7 | bob      | 2011-01-24 |             |
+----+----------+------------+-------------+

表B(基准)

+----+------------+---------+
| id | start-date |  value  |
+----+------------+---------+
|  1 | 2010-01-31 | 1173.19 |
+----+------------+---------+
|  2 | 2010-02-28 | 1199.85 |
+----+------------+---------+
|  3 | 2010-03-31 | 1264.91 |
+----+------------+---------+
|  4 | 2010-04-30 | 1263.43 |
+----+------------+---------+
|  5 | 2010-05-31 | 1211.36 |
+----+------------+---------+
|  6 | 2010-06-30 | 1187.32 |
+----+------------+---------+
|  7 | 2010-07-31 | 1218.30 |
+----+------------+---------+
|  8 | 2010-08-31 | 1207.96 |
+----+------------+---------+
|  9 | 2010-09-30 | 1272.12 |
+----+------------+---------+
| 10 | 2010-10-31 | 1280.27 |
+----+------------+---------+
| 11 | 2010-11-30 | 1275.60 |
+----+------------+---------+
| 12 | 2010-12-31 | 1346.45 |
+----+------------+---------+
| 13 | 2011-01-31 | 1337.07 |
+----+------------+---------+
| 14 | 2011-02-28 | 1338.37 |
+----+------------+---------+
| 15 | 2011-03-31 | 1349.14 |
+----+------------+---------+

这是我想要实现的一个例子:

今天蒂姆的当前替补值=从第一个月到最近一个月的每个月的总和:(第一(基准值)/最新值(基准值)) 第一个日期= 2010-03,即id 3 = 1264.91 最新日期= 2011-03,即id 15 = 1349.14(这总是最后一行,因为我试图计算“今天”,未来没有任何内容)

1/(first/latest)   =1/(1264.91/1349.14) = 1.0666    [this is bench.id=3]
...now iterate...
1/(next/latest)    =1/(1263.43/1349.14) = 1.0678    [bench.id=4]
1/(next/latest)    =1/(1211.36/1349.14) = 1.1137    [bench.id=5]
1/(next/latest)    =1/(1187.32/1349.14) = 1.1363    [bench.id=6]
1/(next/latest)    =1/(1218.30/1349.14) = 1.1074    [bench.id=7]
1/(next/latest)    =1/(1207.96/1349.14) = 1.1169    [bench.id=8]
1/(next/latest)    =1/(1272.12/1349.14) = 1.0605    [bench.id=9]
1/(next/latest)    =1/(1280.27/1349.14) = 1.0538    [bench.id=10]
1/(next/latest)    =1/(1275.60/1349.14) = 1.0577    [bench.id=11]
1/(next/latest)    =1/(1346.45/1349.14) = 1.0020    [bench.id=12]
1/(next/latest)    =1/(1337.07/1349.14) = 1.0090    [bench.id=13]
1/(next/latest)    =1/(1338.37/1349.14) = 1.0080    [bench.id=14]
...and finish up...
1/(current/latest) =1/(1349.14/1349.14) = 1.0000    [bench.id=15]

Total = 13.7997 = 1.0666 + 1.0678 + 1.1137 + 1.1363 + 1.1074 + 1.1169 + 1.0605 + 1.0538 + 1.0577 + 1.002 + 1.009 + 1.008 + 1

所以我想把结果写回表A,给我:

表A(用户)

+----+----------+------------+-------------+
| id | username | start-date | bench-value |
+----+----------+------------+-------------+
|  1 | tim      | 2010-03-04 |     13.7997 |
+----+----------+------------+-------------+

由于这是一个迭代过程,对于像2011年1月开始的'bob'这样的用户来说,这将是一个更短的计算。

我还希望能够每4个月做一次以产生定期统计数据,以便像这样计算用户蒂姆之类的人(找到第一个日期的初始搜索需要在4个月内考虑期):

1/(first/latest)   = 2010-03 = 1/(1264.91/1349.14) = 1.0666
1/(next/latest)    = 2010-07 = 1/(1218.30/1349.14) = 1.1074
1/(next/latest)    = 2010-11 = 1/(1275.60/1349.14) = 1.0577
1/(current/latest) = 2011-03 = 1/(1349.14/1349.14) = 1.0000

Total = 1.0666 + 1.1074 + 1.0577 + 1 = 4.2317

我遇到的主要问题有两个: 1.如何使用user.start-date值为每个用户选择第一个(benchmark.value)基于他年和月(日是不重要的)。 2.如何迭代计算公式直到并包括工作台中的最新值 - 在4月底,将添加id = 16的新行,如果这样运行,则4月值将成为最后一个值用于计算。

因为我现在正在学习SQL和PHP,所以我不确定这个过程的哪些部分应该在SQL中完成,哪些部分在PHP中完成。

任何和所有的帮助都会非常感激,因为我决心想出这个。

我遇到的主要问题有两个:

  1. 如何使用user.start-date值 为每个用户挑选 第一个(benchmark.value)基于 年和月(日是 不重要)。
  2. 如何迭代计算 公式包括和 在替补席上的最新价值 - 在 4月底,新的一排 id = 16将被添加,如果这样 然后运行4月的价值 成为最后使用的价值 计算
  3. 因为我现在正在学习SQL和PHP,所以我不确定这个过程的哪些部分应该在SQL中完成,哪些部分在PHP中完成。

    任何和所有的帮助都会非常感激,因为我决心想出这个。

    仅供参考,我一直在阅读:

    那里有太多的信息,所以一些指导意见将得到真正的赞赏。再次感谢。

2 个答案:

答案 0 :(得分:0)

我不会在表A中包含列bench-value。此值将不断变化,因此最好创建一个View来计算最新的User bench-value或创建一个存储过程来获取a用户作为参数,然后返回基准值

这两个表之间还需要一个链接/密钥,现在无法分辨哪个用户与哪个基准相关

答案 1 :(得分:0)

哇,这个问题很好。可悲的是,我的回复可能要短得多。

我认为您正在寻找的是:

  鲍勃目前的替补值今天=   总和:   第一(benchmark.value)/最新(benchmark.value)   第一次约会= 2011-01,即id 13 =   1337.07最新日期= 2011-03,即id 15 = 1349.14

select username, start_date, tmp.value/tmp2.value as new_mark from tablea
 join (select id,value from tableb having id=min(id) group by id) as tmp
 on tablea.id=tmp.id 
join  (select id,value from tableb having id=max(id) group by id) as tmp2 
on tablea.id=tmp2.id 

这看起来很难看但应该有用。