我很难解释,但我会尝试。
我有一个mysql表,其中包含一个名为“inventory”的字段,它是一个项目数组。我需要计算这个数组中不同项的数量。我的问题是我在游戏中有玩家将太多物品放入此阵列中并导致问题。
以下是一个例子:
[[[ “NVGoggles”, “Mk_48_DZ”],[3,10]],[[ “ItemBandage”, “Skin_Sniper1_DZ”],[2,34]],[[ “DZ_Backpack_EP1”],[1] ]
此数组应计为5个项目。在这种情况下,每个项目的数量无关紧要。 NVGoggles,Mk_48_DZ,ItemBandage,Skin_Sniper1_DZ,DZ_Backpack_EP1
空数组示例:
[[[],[]],[[],[]],[[],[]]]
我需要脚本:
SELECT inventory FROM instance_deployable
,其中deployable_id = 16
计算每行的库存数组。
如果count大于50个不同的项目,请更新行的清单。
我对如何使用MySQL或Perl脚本计算数组感到困惑。
答案 0 :(得分:0)
use strict;
use warnings;
use DBI;
use JSON 'decode_json', 'encode_json';
use List::Util 'sum';
my $limit = 50;
my $deployable_id = 16;
my $dbh = DBI->connect('DBI:mysql:database=test;host=127.0.0.1;port=3306','user','pass',{RaiseError=>1,AutoCommit=>1});
my $sth = $dbh->prepare('select distinct inventory from inventory_deployable where deployable_id=?');
$sth->execute($deployable_id);
my @bad_inventory;
while ( my ($inventory_col) = $sth->fetchrow_array ) {
my $inventory = decode_json($inventory_col);
if ( $limit < sum map scalar @{ $_->[0] }, @$inventory ) {
push @bad_inventory, $inventory_col;
}
}
$sth = $dbh->prepare('update inventory_deployable set inventory=? where inventory=? and deployable_id=?');
for my $inventory_col (@bad_inventory) {
my $inventory = decode_json($inventory_col);
my $keep = $limit;
for my $category (@$inventory) {
if ( @{ $category->[0] } > $keep ) {
splice @{ $category->[0] }, $keep;
splice @{ $category->[1] }, $keep;
}
$keep -= @{ $category->[0] };
}
my $new_inventory_col = encode_json($inventory);
$sth->execute($new_inventory_col, $inventory_col, $deployable_id);
}