使用Perl匹配MySQL表
我有两个MYSQL表,即。主表和查询1。主表包含列位置和chr,而查询1包含位置、chr和符号。query1表是通过查询主_表得到的。我希望使用Perl匹配这两个表,这样输出将在第一列中包含主_表中的整个位置列表,第二列将是对应于该位置的符号。可能根本没有符号,或者每个位置只能有一个或多个符号 我不是很确定如何为这个编写代码,目前我有使用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
#!/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);
=====================================================================================
上面的代码只列出了位置和符号,但并不匹配它们。我似乎不知道如何把它们搭配起来。任何建议
谢谢。
CarenWeegee的答案是正确的,您可以像这样指定表的位置:
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?