昨天开始学习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中完成。
任何和所有的帮助都会非常感激,因为我决心想出这个。
我遇到的主要问题有两个:
因为我现在正在学习SQL和PHP,所以我不确定这个过程的哪些部分应该在SQL中完成,哪些部分在PHP中完成。
任何和所有的帮助都会非常感激,因为我决心想出这个。
仅供参考,我一直在阅读:
那里有太多的信息,所以一些指导意见将得到真正的赞赏。再次感谢。
答案 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
这看起来很难看但应该有用。