[Dbix-class] New user with JOIN problem
Chris Cole
chris at compbio.dundee.ac.uk
Tue May 12 11:10:53 GMT 2009
Hi all,
I've been using the perl DBI for quite a while now and am quite
comfortable with it to access my MySQL databases. I thought I'd give
DBIx a go as I've heard good things about it.
However, I'm really struggling to replicate a simple SQL SELECT
statement via a JOIN.
THe two tables are:
CREATE TABLE `seq_data` (
`id` varchar(255) NOT NULL default '',
`seq` varchar(255) NOT NULL default '',
`length` tinyint(3) unsigned NOT NULL default '0',
`abundance` mediumint(8) unsigned NOT NULL default '0',
`condensed` enum('Y','N') NOT NULL default 'N',
`c_abundance` mediumint(8) unsigned default NULL,
PRIMARY KEY (`id`),
KEY `better` (`id`(8))
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
CREATE TABLE `mirbase_hairpin_match` (
`query_id` varchar(255) NOT NULL default '',
`miRNA_id` varchar(50) NOT NULL default '',
`query_start` smallint(5) unsigned NOT NULL default '0',
`match_start` smallint(5) unsigned NOT NULL default '0',
`mismatch` tinyint(3) unsigned NOT NULL default '0',
KEY `mirna_idx` (`miRNA_id`(9)),
KEY `query_idx` (`query_id`(8)),
KEY `query_id` (`query_id`),
CONSTRAINT `mirbase_hairpin_match_ibfk_1` FOREIGN KEY (`query_id`)
REFERENCES `seq_data` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
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 = 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 = id
AND query_id LIKE 'mmuD%'
but the nearest I can get to is (code snippet):
my @rnas = $schema->resultset(MirbaseHairpinMatch)->search(
{
query_id => { -like => "$dataset%" },
},
{
columns => [ qw/query_id mirna_id/ ],
join => { seq_data => 'abundance'},
group_by => [qw/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;
}
This fails with "DBIx::Class::ResultSet::search(): No such relationship
seq_data at ./get_all_miRNA_DBIx.pl line 55"
Any help would be greatly appreciated.
More information about the DBIx-Class
mailing list