2012-04-17 3 views
2

Я пытаюсь вывести результаты запроса mysql в формате JSON, но изо всех сил стараюсь вывести массив в формате, который я хочу.perl json output from mysql query

мой SQL таблицы, как показано ниже

Array1,Type,Somevalue 
Record1,Type1,1 
Record1,Type2,2 
Record1,Type3,3 
Record2,Type1,4 
Record3,Type1,5 
Record3,Type3,6 

Мой Perl код retrive MySQL строки и разобрать на JSON ниже

use DBD::Mysql; 
use JSON::XS; 
use IO::File; 
use warnings; 
use Data::Dumper::Names; 
use POSIX; 


my $json = JSON::XS->new->ascii->pretty->allow_nonref; 

my $datasource = "dbi:mysql:database=$dbname;host=$host;port=$port"; 
#PERL DBI CONNECT 
my $dbh =DBI->connect($datasource, $dbusername, $dbpasswd) || die "Could not connect to database: $DBI::errstr"; 
#PREPARE THE QUERY 
my $query1=qq(select * from table); 

my $query_handle1 = $dbh->prepare($query1); 

#EXECUTE THE QUERY 
$query_handle1->execute(); 

#my variable 
my $i; 

my @Types = ("Type1","Type2","Type3"); 
my @Array1 = ("Record1","Record2","Record3","Record4"); 
my @sql_query_1_Results; 

#LOOP THROUGH RESULTS and store results for later processing 
while(my $row = $query_handle1->fetchrow_hashref) { 
push @sql_query_1_Results, $row; 
} 

# create data arrays for record we should get 3 arrays with values 
for ($i=0;$i<=$#sql_query_1_Results;$i++) 
{ 
push @{$sql_query_1_Results[$i]->{record}},$sql_query_1_Results[$i]->{Some_Value}; 
} 

foreach my $record(@Array1){ 
$json = encode_json({ 'name' => $record, 'data'=> \@{$record} }); 
push @chart1_data, $json; 
} 
#DISCONNECT FROM THE DATABASE 
$dbh->disconnect(); 

#JSON OUTPUT 
my $chart1_data_json=encode_json({ chart1 => \@chart1_data }); 
print $chart1_data_json; 

Приведенный выше код даст мне массив как ниже

Record1=[1,2,3] 
Record2=[4] 
Record3=[5,6] 

, но я хотел был бы поддерживать порядок типа ie в формате ниже

Record1=[1,2,3] 
Record2=[4,0,0] 
Record3=[5,0,6] 
+1

Всегда 'использовать строгие;' и 'использовать предупреждения '. Никогда не включайте непосредственно модули «DBD :: *». Вместо этого используйте «DBI;». – dgw

+0

@dgw Tks. Я обычно включаю предупреждение, но будет включать строгий и используемый DBI. Можете ли вы посоветовать, как получить упорядоченный массив? – Linus

ответ

2
#!/usr/bin/perl 

use strict ; 
use warnings; 
use DBI; 
use JSON::XS; 
use IO::File; 
use Data::Dumper::Names; 
use POSIX; 

my $json = JSON::XS->new->ascii->pretty->allow_nonref; 

my ($dbname , $host , $port , $dbusername , $dbpasswd) ; # Satisfy strict 

my $datasource = "dbi:mysql:database=$dbname;host=$host;port=$port"; 
#PERL DBI CONNECT 
my $dbh =DBI->connect($datasource, $dbusername, $dbpasswd) || die "Could not connect to database: $DBI::errstr"; 
#PREPARE THE QUERY 
my $query1=qq(select * from table); 

my $query_handle1 = $dbh->prepare($query1); 

#EXECUTE THE QUERY 
$query_handle1->execute(); 

my @Types = ("Type1","Type2","Type3"); 
my @Array1 = ("Record1","Record2","Record3","Record4"); 

# BEGIN modified data munching 
my %result ; 
my %Type_Pos ; 
@Type_Pos{@Types} = (0 .. $#Types) ; # Map the type to position 

while(my $row = $query_handle1->fetchrow_hashref) { 
    if(! exists $result{$row->{Array1}}) { 
    # Initialize Record with all possible types 
    $result{$row->{Array1}} = [ map { 0 } @Types ] ; 
    } 
    $result{$row->{Array1}}->[$Type_Pos{$row->{Type}}] = $row->{Somevalue} ; 
} 

my @chart1_data = map { encode_json({ 'name' => $_, 'data'=> $result{$_} }) 
         } sort keys %result ; 
# END modified data munching 

$dbh->disconnect(); 

#JSON OUTPUT 
my $chart1_data_json=encode_json({ chart1 => \@chart1_data }); 
print $chart1_data_json; 

Это должно делать то, что вы просили.
Вместо сохранения данных в массиве я конкретизую хэш, где запись является ключом, а значение arrayref из Somevalue (по порядку типов) - это значение.

+0

благодарит за вашу помощь. В цикле while имеется мало синтаксических ошибок. Я устал исправлять, как показано ниже, но не вижу значения в массиве. Можете ли вы, пожалуйста, посмотреть? while (my $ row = $ query_handle1-> fetchrow_hashref) { if (! Существует $ result {$ row -> {Array1}}) { # Инициализировать запись всеми возможными типами $ result {$ row -> {Array1 }} = [map {0} @Types]; } $ result {$ row -> {Array1} -> [$ Type_Pos {$ row -> {Type}}]} = $ row -> {Somevalue}; } – Linus

+0

@Linus Вы были правы, всегда такая же ошибка ... исправлено сейчас. – dgw

+0

оцените вашу помощь. я все еще неясен в утверждении: «if (! exists $ result {$ row -> {Array1}}) - это значит проверить, имеет ли строка какой-либо элемент в Array1? и вы также можете объяснить «$ result {$ row -> {Array1}} = [map {0} @Types]" – Linus