使用Perl匹配MySQL表

使用Perl匹配MySQL表,sql,perl,Sql,Perl,我有两个MYSQL表,即。主表和查询1。主表包含列位置和chr,而查询1包含位置、chr和符号。query1表是通过查询主_表得到的。我希望使用Perl匹配这两个表,这样输出将在第一列中包含主_表中的整个位置列表,第二列将是对应于该位置的符号。可能根本没有符号,或者每个位置只能有一个或多个符号 我不是很确定如何为这个编写代码,目前我有 #!/usr/bin/perl use strict; use DBI; my %ucsc; my $dbh = DBI->connect('DBI

我有两个MYSQL表,即。主表和查询1。主表包含列位置和chr,而查询1包含位置、chr和符号。query1表是通过查询主_表得到的。我希望使用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);
以下是主_表和查询1的示例。所需的输出是我所期望的,我使用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           
提前谢谢


Caren

如果您已经有了所有的数据,您只是想知道如何在列中输出它,您应该查看哪些列,哪些列允许您格式化输出字符串。

听起来您需要在SQL查询中执行一个
join
操作,但是您需要某种关系才能正常工作。您也许可以使用

在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");
$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

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;

你能给出一些示例数据和你想得到的吗?你已经有一些代码了吗?问题是Perl还是SQL部分?您听说过SQL
join
?我在MYSQL中有两个单独的表中的数据,我需要匹配这两个表的位置,并打印相应位置的符号。我还想打印出整个位置列表,它是main_表中的一列。所以我猜这意味着您既不懂Perl也不懂SQL?