Perl脚本/ MySQL查询,从字段的mysql数据库查询计算现有数组

时间:2014-02-22 22:49:36

标签: mysql arrays perl

我很难解释,但我会尝试。

我有一个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脚本计算数组感到困惑。

1 个答案:

答案 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);
}