[Dbix-class] New user with JOIN problem
David Ihnen
davidi at norchemlab.com
Tue May 12 17:12:12 GMT 2009
Chris Cole wrote:
> Ultimately, the SQL code I want to replicate is:
>
> SELECT miRNA_id, sum(abundance) as sum
> FROM mirbase_hairpin_match, seq_data
> WHERE query_id =3D id
> AND query_id LIKE 'mmuD%'
> GROUP BY miRNA_id
>
> I've tried breaking it down to a simpler SQL for testing:
> SELECT query_id, miRNA_id, abundance
> FROM mirbase_hairpin_match
> JOIN seq_data ON query_id =3D id
> AND query_id LIKE 'mmuD%'
>
> but the nearest I can get to is (code snippet):
> my @rnas =3D $schema->resultset(MirbaseHairpinMatch)->search(
> {
> query_id =3D> { -like =3D> "$dataset%" },
> },
> {
> columns =3D> [ qw/query_id mirna_id/ ],
> join =3D> { seq_data =3D> 'abundance'},
> group_by =3D> [qw/mirna_id/],
> },
> );
> =
First of all, you didn't include your code that is supposed to match the =
tables, so its hard to say exactly what is wrong. Keep in mind its =
important what the classes are defined as to debug errors like this in =
the future.
But I'm going to suspect that MirbaseHairpinMatch.pm MUST have a line =
something like this in it
__PACKAGE__->belongs_to('seq_data', 'Whatever::seq_data', { 'foreign.id' =
=3D> 'self.query_id' });
In order for anything like 'seq_data' to be in the 'join' clause, you =
must define the relationship!
Additionally, 'abundance' being in the join clause makes no sense at all =
as it is *not* a relationship, and may be causing the error.
So i'm going to guess what you mean is more like:
my @rnas =3D $schema->resultset(MirbaseHairpinMatch)->search
( { query_id =3D> { -like =3D> $dataset."%" } }
, { 'select' =3D> [ 'mirna_id', 'SUM(abundance)' ]
, 'as' =3D> [ 'mirna_id', 'sum' ]
, join =3D> 'seq_data'
, group_by =3D> 'mirna_id'
},
);
> printf "Found %d miRNAs in dataset $dataset\n", scalar @rnas;
> foreach my $mirna (@rnas) {
> printf "miRNA: %s %d\n", $mirna->mirna_id, $mirna->abundance;
> }
> =
You seem slightly confused about how to access columns too. If you =
wanted the abundance value, you would prefetch it (not just join) and =
access through $mirna->seq_data->abundance - but you don't want that, do =
you? You're selecting the sum. But thats not an accessor because its =
an additional as column. So you use get_column instead.
printf "Found %d miRNAs in dataset $dataset\n", scalar @rnas;
foreach my $mirna (@rnas) {
printf "miRNA: %s %d\n", $mirna->mirna_id, $mirna->get_column('sum');
}
Hope that helps,
David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.scsys.co.uk/pipermail/dbix-class/attachments/20090512/62a=
1d8a5/attachment.htm
More information about the DBIx-Class
mailing list