如果 table 中缺少,则为每个数组元素添加记录
Add record for each array elements if missing in table
我觉得我需要一点力气才能突破这个。
我有这样一组玩家
$playerids = ['1', '2', '3', '4']
我有这样一组句号
$periods = ['March 2022', 'April 2022', 'May 2022']
我有一个这样的 table(order by date_time desc
已经应用,所以我可以获得最新分数)
-----date_time------------period----------playerid-----score
2022-05-06 10:08:12------May 2022-----------3----------1614
2022-05-06 10:08:12------May 2022-----------1----------1545
2022-04-25 16:24:30------April 2022---------3----------1765
2022-04-25 15:32:40------April 2022---------2----------1753
2022-04-24 15:54:50------April 2022---------3----------1545
2022-03-27 06:18:12------March 2022---------4----------1570
2022-03-25 06:16:37------March 2022---------3----------1574
2022-03-24 15:54:50------March 2022---------2----------1753
2022-03-24 15:54:50------March 2022---------1----------1583
我的目标是对于每个时期,每个玩家必须至少有 1 条记录,如果没有,我们会查看该玩家上一时期的最新分数,并用它来添加缺失的分数更新期间(日期可以设置为每月 1 号午夜)。
上面的例子应该变成:
-----date_time------------period---------playerid-----score
2022-05-01 00:00:00------May 2022-----------4----------1570<-----new row
2022-05-01 00:00:00------May 2022-----------2----------1753<-----new row
2022-05-06 10:08:12------May 2022-----------3----------1614
2022-05-06 10:08:12------May 2022-----------1----------1545
2022-04-01 00:00:00------April 2022---------4----------1570<-----new row
2022-04-01 00:00:00------April 2022---------1----------1583<-----new row
2022-04-25 16:24:30------April 2022---------3----------1765
2022-04-25 15:32:40------April 2022---------2----------1753
2022-04-24 15:54:50------April 2022---------3----------1545
2022-03-27 06:18:12------March 2022---------4----------1570
2022-03-25 06:16:37------March 2022---------3----------1574
2022-03-24 15:54:50------March 2022---------2----------1753
2022-03-24 15:54:50------March 2022---------1----------1583
我一直在考虑对每个数组使用 foreach 来检查条件,但恐怕可能有更快的解决方案。非常感谢任何指点。
经过 5 天的拒绝放手,我想出了这个:)
第 1 步 - 创建一个参考 table,其中包含每个玩家的所有时段
$reference = $mysqli->query("create temporary table reference (periodid int(3), period varchar(15), playerid int, score int); ");
foreach ($playerids as $kp=>$pl) {
foreach ($periods as $kd=>$pd) {
$referenceins = $mysqli->query("insert into reference (periodid, period, playerid) values ('$kd', '$pd', '$pl')");
}
}
第 2 步 - 使用 left join
和 reference
并使用 if
确定用于 score
的值,用于下一个 row
foreach ($playerids as $kp=>$pl) {
$reference2 = $mysqli->query("select periodid, period, playerid, date_time, @prev := IF(score > 0,score,@prev) AS score
from (select ref.periodid as periodid, ref.period as period, ref.playerid as playerid,
coalesce(tb.date_time, 'not found') as date_time,
coalesce(tb.score, 'not found') as score
FROM reference as ref
LEFT JOIN table as tb
ON ref.period = tb.period AND ref.playerid = tb.playerid
WHERE ref.playerid = $pl
ORDER BY playerid asc, periodid asc) temp, (SELECT @prev := null) ini_value
");
}
我觉得我需要一点力气才能突破这个。
我有这样一组玩家
$playerids = ['1', '2', '3', '4']
我有这样一组句号
$periods = ['March 2022', 'April 2022', 'May 2022']
我有一个这样的 table(order by date_time desc
已经应用,所以我可以获得最新分数)
-----date_time------------period----------playerid-----score
2022-05-06 10:08:12------May 2022-----------3----------1614
2022-05-06 10:08:12------May 2022-----------1----------1545
2022-04-25 16:24:30------April 2022---------3----------1765
2022-04-25 15:32:40------April 2022---------2----------1753
2022-04-24 15:54:50------April 2022---------3----------1545
2022-03-27 06:18:12------March 2022---------4----------1570
2022-03-25 06:16:37------March 2022---------3----------1574
2022-03-24 15:54:50------March 2022---------2----------1753
2022-03-24 15:54:50------March 2022---------1----------1583
我的目标是对于每个时期,每个玩家必须至少有 1 条记录,如果没有,我们会查看该玩家上一时期的最新分数,并用它来添加缺失的分数更新期间(日期可以设置为每月 1 号午夜)。 上面的例子应该变成:
-----date_time------------period---------playerid-----score
2022-05-01 00:00:00------May 2022-----------4----------1570<-----new row
2022-05-01 00:00:00------May 2022-----------2----------1753<-----new row
2022-05-06 10:08:12------May 2022-----------3----------1614
2022-05-06 10:08:12------May 2022-----------1----------1545
2022-04-01 00:00:00------April 2022---------4----------1570<-----new row
2022-04-01 00:00:00------April 2022---------1----------1583<-----new row
2022-04-25 16:24:30------April 2022---------3----------1765
2022-04-25 15:32:40------April 2022---------2----------1753
2022-04-24 15:54:50------April 2022---------3----------1545
2022-03-27 06:18:12------March 2022---------4----------1570
2022-03-25 06:16:37------March 2022---------3----------1574
2022-03-24 15:54:50------March 2022---------2----------1753
2022-03-24 15:54:50------March 2022---------1----------1583
我一直在考虑对每个数组使用 foreach 来检查条件,但恐怕可能有更快的解决方案。非常感谢任何指点。
经过 5 天的拒绝放手,我想出了这个:)
第 1 步 - 创建一个参考 table,其中包含每个玩家的所有时段
$reference = $mysqli->query("create temporary table reference (periodid int(3), period varchar(15), playerid int, score int); ");
foreach ($playerids as $kp=>$pl) {
foreach ($periods as $kd=>$pd) {
$referenceins = $mysqli->query("insert into reference (periodid, period, playerid) values ('$kd', '$pd', '$pl')");
}
}
第 2 步 - 使用 left join
和 reference
并使用 if
确定用于 score
的值,用于下一个 row
foreach ($playerids as $kp=>$pl) {
$reference2 = $mysqli->query("select periodid, period, playerid, date_time, @prev := IF(score > 0,score,@prev) AS score
from (select ref.periodid as periodid, ref.period as period, ref.playerid as playerid,
coalesce(tb.date_time, 'not found') as date_time,
coalesce(tb.score, 'not found') as score
FROM reference as ref
LEFT JOIN table as tb
ON ref.period = tb.period AND ref.playerid = tb.playerid
WHERE ref.playerid = $pl
ORDER BY playerid asc, periodid asc) temp, (SELECT @prev := null) ini_value
");
}