2014-02-22 2 views
1

설명하기가 어렵지만 시도 할 것입니다.Perl 스크립트/MySQL 쿼리는 기존 데이터베이스의 배열을 mysql 데이터베이스에서 쿼리합니다.

"items"배열 인 "inventory"라는 필드가있는 mysql 테이블이 있습니다. 이 배열의 다른 항목 수를 계산해야합니다. 내 문제는이 배열에 너무 많은 항목을 넣고 문제를 일으키는 게임 플레이어가 있다는 것입니다. 여기

은 예이다 :

[[ "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

빈 어레이

예 :

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

deployable_id = 16 각 행에 대한 재고 배열을 카운트 곳 instance_deployable로부터

SELECT 재고 :

나는에 스크립트가 필요합니다. 개수가 50 개를 초과하는 항목 인 경우 행의 인벤토리를 업데이트합니다.

MySQL 또는 Perl 스크립트를 사용하여 배열을 계산하는 방법에 대해 잘 모르겠습니다.

+0

음, 배열을 정확히 저장 하시겠습니까? SQL에는 이러한 유형의 개념이 없습니다. 그것을 문자열로 저장하고 있습니까? – amon

+0

예 문자열입니다. 나는 여기서 내 요소에서 약간 벗어났다. – justchil

+0

기본 키가 무엇입니까? – ysth

답변

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); 
} 
+0

거의 완벽하게 일하고 있습니다. 한계가 50이면 실행 후 49/50이됩니다. 51로 제한을 변경하면 51/50이됩니다. Hmmm – justchil

+0

인벤토리를 50으로 표시 할 수 있습니까? – ysth

관련 문제