【问题标题】:Perl Script / MySQL query that counts existing array from mysql database query of a fieldPerl 脚本/MySQL 查询从 mysql 数据库查询中计算现有数组
【发布时间】:2014-03-24 13:51:33
【问题描述】:

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

我有一个 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

空数组示例:

[[[],[]],[[],[]],[[],[]]]

我需要脚本:

instance_deployable 中选择库存,其中 deployable_id = 16 计算每一行的库存数组。 如果计数大于 50 个不同的项目,则更新行的库存。

我不知道如何使用 MySQL 或 Perl 脚本来计算数组。

【问题讨论】:

  • 嗯,你如何准确地存储数组? SQL 没有这种类型的概念……。您是否将其存储为字符串?
  • 是的字符串。我在这里有点不合时宜。
  • 什么是主键?
  • id 是主键。如果有帮助,我可以发布结构。
  • 您是否希望以某种特定方式更新库存?或者只是删除项目,直到它不再超过 50?

标签: mysql arrays perl


【解决方案1】:
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);
}

【讨论】:

  • 工作几乎完美。如果限制为 50,则运行后会留下 49/50。如果我将限制更改为 51,它会留下 51/50。嗯
猜你喜欢
  • 2017-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多