2009-07-29 8 views
0

私は2つのMYSQLテーブルを持っています。 main_tableとquery1。 main_tableにはpositionとchrの列が含まれ、query1にはposition、chr、およびsymbolが含まれます。テーブルquery1は、main_tableを照会することによって導出されます。私は、出力が最初の列のmain_tableからの位置のリスト全体を持ち、2番目の列がその位置に対応するシンボルになるように、これらの両方のテーブルをPerlを使用して一致させたいと思います。シンボルはまったく存在しないか、またはそれぞれの位置に対して1つのシンボルまたは複数のシンボルが存在する可能性があります。私は、このためのコードアップを作成する方法は非常に特定ではないです、現在私は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とQuery1というの例です。希望の出力は私が期待しているもので、私はそれを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

あなたはすでに、すべてのデータを持っている、あなたはちょうどあなたがsprintfと書式設定することができprintfでどのように見えるべきかの列に出力することを疑問に思っている場合出力文字列。

+0

私はMYSQL内の2つの別々のテーブルにデータを持っています。テーブルの両方の位置を合わせて対応する位置のシンボルを表示する必要があります。私はまた、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

Weegeeには正しい答えがあります。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; 
関連する問題