2009-07-29 2 views
0

나는 2 개의 MYSQL 테이블을 가지고있다. main_table 및 query1. main_table은 position 및 chr 열을 포함하고 query1은 position, chr 및 symbol을 포함합니다. 테이블 query1은 main_table을 쿼리하여 파생됩니다. 첫 번째 열에는 main_table의 전체 위치 목록이 있고 두 번째 열에는 그 위치에 해당하는 기호가 출력되도록 Perl을 사용하여이 두 테이블을 모두 일치 시키려고합니다. 기호가 전혀 없거나 하나의 기호 또는 각 위치의 기호가 여러 개있을 수 있습니다. 나는이에 대한 코드 위로를 작성하는 방법을 아주 확실하지 오전Perl을 사용하여 MySQL 테이블 일치하기

은, 현재 나는

#!/usr/bin/perl 

use strict; 
use DBI; 

my %ucsc; 

my $dbh = DBI->connect('DBI:mysql:disc1pathway;user=home;password=home'); 
my $dbs = DBI->connect('DBI:mysql:results;user=home;password=home'); 
my $main = $dbh->prepare("select chr, position from main_table");   
my $q1 = $dbs->prepare("select position, symbol, chrom from query1"); 

$main->execute(); 
$q1->execute();  

while (my $main_ref = $main->fetchrow_hashref()) { 
    $ucsc{$main_ref->{chr}}{$main_ref->{position}} = 1; 
} 

while (my $gene_ref = $q1->fetchrow_hashref()) { 
    my $q1position = $gene_ref->{position}; 
    my $q1symbol = $gene_ref->{symbol}; 
    my $q1chr  = $gene_ref->{chr}; 

    foreach my $ucsc (keys %{$ucsc{$q1chr}}) { 
     print "$ucsc $q1symbol\n"; 
    } 
} 

$dbh->disconnect(); 
$dbs->disconnect(); 

exit (0); 

main_table과 쿼리 2의 예는 다음과

있습니다. 원하는 결과물은 내가 기대하는 바이며 Excel에서 VLOOKUP 함수를 사용하여 출력했습니다. 이미 모든 데이터를 가지고 사전에

main_table    
CHR Position   
chr1 229830537  
chr1 229723373   
chr1 229723385   
chr1 229723393   
chr1 229723420   
chr1 229829627  
chr1 229723430   
chr1 229829926  
chr1 229723483   
chr1 229723490   
chr1 229723499   
chr1 229723501   
chr1 229830343  
chr1 229723534   
chr1 229723540   
chr1 230039934  
chr1 229723576   
chr1 229830537  
chr1 229830469   
chr1 229725982   
chr1 229726209  
chr1 229966154  
chr1 229726439   
chr1 229726726   
chr1 229726755   
chr1 229726973  
chr1 229967564  
chr1 229727249   
chr1 229727408   
chr1 229727612   
chr1 229728018   
chr1 229728050   
chr1 229728435       
chr1 229728513       
chr1 229966327       

Query1    
symbol CHR Position   
C1 chr1 229829230  
C1 chr1 229829278   
C1 chr1 229829442  
C1 chr1 229829627  
C1 chr1 229829653  
C1 chr1 229829683  
C1 chr1 229829810   
C1 chr1 229829926  
C1 chr1 229829961   
C1 chr1 229830085   
C1 chr1 229830086   
C1 chr1 229830087   
C1 chr1 229830088  
C1 chr1 229830141   
C1 chr1 229830343  
C1 chr1 229830469  
C1 chr1 229830534  
C1 chr1 229830537  
C2 chr1 230039932  
C2 chr1 230039934   
C2 chr1 230039939  
C2 chr1 230039944  
457 chr1 229966154   
457 chr1 229966327  
457 chr1 229966500   
457 chr1 229966552   
457 chr1 229966748  
457 chr1 229966998   
457 chr1 229967327   
457 chr1 229967564   
457 chr1 229967594   
457 chr1 229829627  



Desired Output   
Position symbol  
229830537 C1  
229723373   
229723385   
229723393   
229723420   
229829627 C1, 457  
229723430   
229829926 C1  
229723483   
229723490   
229723499   
229723501   
229830343 C1  
229723534   
229723540   
230039934 c2  
229723576   
229830537 C1  
229830469   
229725982   
229726209   
229966154 457  
229726439   
229726726   
229726755   
229726973   
229967564 457  
229727249   
229727408   
229727612   
229728018   
229728050   
229728435   
229728513   
229966327   

덕분에

카렌

+0

예제 데이터를 얻을 수 있습니까? – jeje

+0

이미 코드가 있습니까? Perl이나 SQL 부분에 문제가 있습니까? – innaM

+0

SQL join에 대해 들었습니까? http://en.wikipedia.org/wiki/Join_%28SQL%29 –

답변

0

당신은 당신이 형식을 허용 sprintfprintf 보는 방법으로 출력이 열에 궁금 출력 문자열.

+0

MYSQL 내의 두 개의 개별 테이블에 데이터가 있습니다. 두 테이블의 위치를 ​​일치 시켜서 해당 위치에 대한 심볼을 인쇄해야합니다. 또한 main_table의 열인 전체 위치 목록을 출력하려고합니다. –

+0

그래서 당신도 Perl도 SQL도 알지 못했을 것입니다. – innaM

1

SQL 쿼리에서 join 작업을 수행해야하는 것처럼 들리지만 제대로 작동하려면 어떤 종류의 관계가 필요합니다. MySQL reference manual's section on JOIN syntax을 사용하여 필요한 것을 파악할 수 있습니다.

Perl 측에서 출력용 로직을 작성해야합니다. "위치"를 키로 사용하고 임의의 기호를 값으로 사용하여 해시를 만드는 것이 좋습니다. 먼저 해시를 채운 다음 출력을 수행하십시오. 원하는 방식으로 쿼리를 출력하는 프로세스가 단순 해집니다.

0
use strict; 
use DBI; 

my %ucsc; 

my $dbh = DBI->connect('DBI:mysql:disc1pathway;user=home;password=home'); 
my $dbs = DBI->connect('DBI:mysql:results;user=home;password=home'); 

my $main = $dbh->prepare("select chr, position from main_table"); 
$main->execute(); 

my $q1 = $dbs->prepare("select position, symbol, chrom from query1"); 
$q1->execute(); 


while (my $main_ref = $main->fetchrow_hashref()) { 
    $ucsc{$main_ref->{chr}}{$main_ref->{position}} = 1; 
} 

while (my $gene_ref = $q1->fetchrow_hashref()) { 
    my $q1position = $gene_ref->{position}; 
    my $q1symbol = $gene_ref->{symbol}; 
    my $q1chr  = $gene_ref->{chr}; 

    foreach my $ucsc (keys %{$ucsc{$q1chr}}) { 
     print "$ucsc $q1symbol\n"; 
    } 
} 

$dbh->disconnect(); 
$dbs->disconnect(); 

exit (0); 

=========================================== ==========================

위 코드는 위치와 기호를 나열하지만 일치하지는 않습니다. 나는 그들과 어울리는 방법에 관해서 주위에 나의 머리를 얻는 것처럼 보인다. 어떤 제안.

감사합니다. Caren

0

위지는 옳은 대답을 가지고 있습니다. ipaddress.database.table과 같은 테이블의 위치를 ​​지정할 수 있습니다. 동일한 컴퓨터에있는 경우 ipaddress 부분을 삭제할 수 있으며 동일한 데이터베이스에있는 경우 데이터베이스 부분을 삭제할 수 있습니다. 따라서 코드는 다음과 같이 보이게됩니다.

#!/usr/bin/perl 

use strict; 
use warnings; 

use DBI; 

my $dbh = DBI->connect(
    'DBI:mysql:disc1pathway', 
    "home", 
    "home", 
    { 
     ChopBlanks  => 1, 
     AutoCommit  => 1, 
     PrintError  => 0, 
     RaiseError  => 1, 
     FetchHashKeyName => 'NAME_lc', 
    } 
) or die "could not connect to database: ", DBI->errstr; 

my $sth = $dbh->prepare(" 
    SELECT 
     disc1pathway.main_table.chr, 
     disc1pathway.main.position, 
     results.query1.symbol, 
     results.query1.chrom 
    FROM disc1pathway.main_table, results.query1 
    JOIN results.query1 ON (
     disc1pathway.main_table.position = results.query1.position 
    ) 
");   

$sth->execute; 

while (my $col = $sth->fetchrow_hashref) { 
    print join(" ", @{$col}{qw/chr position symbol chrom/}), "\n";   
} 

$sth->finish; 

$dbh->disconnect; 
관련 문제