2009-07-29 2 views
0

У меня есть 2 таблицы MYSQL, а именно: main_table и query1. main_table содержит позицию столбцов и chr, тогда как query1 содержит позицию, chr и символ. Таблица query1 выводится путем запроса к main_table. Я хочу сопоставить обе эти таблицы с помощью Perl, так что на выходе будет весь список позиций из main_table в первом столбце, а второй столбец будет символом, соответствующим этой позиции. Не может быть никаких символов вообще или только один символ или несколько символов для каждой позиции.Соответствие таблиц MySQL с использованием Perl

Я не очень уверен, как писать код для этого, в настоящее время у меня есть

#!/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. Желаемый результат - это то, что я ожидаю, и я его разработал, используя функцию VLOOKUP в excel.

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   

Заранее спасибо

Caren

+0

Можете привести примеры данных и то, что вы хотели бы получить? – jeje

+0

У вас уже есть код? Является ли проблема частью Perl или SQL? – innaM

+0

Вы слышали о SQL 'join'? http://en.wikipedia.org/wiki/Join_%28SQL%29 –

ответ

0

Если у вас есть все данные уже и вы просто интересно, как вывести его в колонках вы должны смотреть на sprintf и printf, которые позволяют вам формат выходные строки.

+0

У меня есть данные в двух отдельных таблицах в MYSQL, мне нужно совместить позиции обеих таблиц и печатать символы для соответствующей позиции. Я также хочу распечатать весь список позиций, который является столбцом в main_table. – 2009-07-29 09:53:13

+0

Итак, я думаю, это означает, что вы не знаете ни Perl, ни SQL? – innaM

1

Похоже, вам нужно выполнить операцию join в вашем SQL-запросе, но для этого вам понадобятся какие-то отношения. Возможно, вы сможете выяснить, что вам нужно, используя 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; 
Смежные вопросы