Вчера начал изучать PHP и MySQL и сумел создать две таблицы, вставить строки и затем отобразить эти данные на веб-странице, используя различные группы. Теперь мне нужно сделать расчет на основе данных в двух таблицах и записать результат обратно в одну из таблиц.
Я пытаюсь выяснить, как выполнить уравнение для строки с датой в таблице A, используя диапазон значений, связанный с диапазоном дат в таблице B. Эти две даты имеют формат YYYY-MM- ДД, но дни в основном не совпадают, поэтому мне нужно совпадать по месяцам.
Вот две таблицы, которые у меня есть:
Таблица 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 |
+----+------------+---------+
А вот пример того, чего я пытаюсь достичь:
текущее значение Тима сегодня = сумма: (первая (benchmark.value) / последняя (benchmark.value)) за каждый месяц с первого по последний месяц включительно
Первая дата = 2010-03, которая является идентификатором 3 = 1264.91
Последняя дата = 2011-03, т. Е. Идентификатор 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 |
+----+----------+------------+-------------+
Поскольку это итеративный процесс, для такого пользователя, как 'bob', начавшегося в 2011-01 году, расчет будет намного короче.
Я также хотел бы иметь возможность делать это каждые 4 месяца, чтобы получать статистику по срокам, чтобы такой пользователь, как пользователь tim, рассчитывался следующим образом (первоначальный поиск, чтобы найти первую дату, должен был принимать во внимание в течение 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. как итеративно рассчитать формулу до и включая самое последнее значение в таблице результатов - в конце апреля добавится новая строка с id = 16, и если она будет выполнена, то апрельское значение станет последним значением используется в расчете.
Пока я изучаю SQL и PHP, я не уверен, какие части этого процесса следует выполнять в SQL, а какие в PHP.
Любая помощь будет принята с благодарностью, поскольку я полон решимости выяснить это.
У меня есть две главные проблемы:
- как использовать значение user.start-date
для каждого пользователя выбрать
первый (benchmark.value) на основе
год и месяц (день
неважно).
- как итеративно вычислить
Формула до и в том числе
последнее значение в таблице скамейки - при
конец апреля, новый ряд с
ID = 16 будет добавлено, и если это
были запущены тогда апрельское значение будет
стать последним значением, использованным в
расчет.
Поскольку я сейчас изучаю SQL и PHP, я не уверен, какие части этого процесса следует выполнять в SQL, а какие в PHP.
Любая помощь будет принята с благодарностью, так как я полон решимости выяснить это.
Просто для справки, я читал:
Там почти слишком много информации, поэтому некоторые руководствовавшиеся советы были бы очень благодарны. Еще раз спасибо.