Re: MySQL queries in a relational database
Darren Duncan <[email protected]> Thu, 31 Mar 2011 01:52:58 -0700
| Newsgroups | gmane.comp.db.mysql.perl |
|---|---|
| Message-ID | <[email protected]> |
francesca casalino wrote:
> Hi Duncan,
> Thank you for the hint about doing the insert and select in one step. I
> tried that but it is not inserting any records, and it does not give me an
> error message.
> This is what I am doing:
>
> #count number of alleles entered for each variation:
>
> my $sth =$dbh->prepare("INSERT into frequency (total_count)
> SELECT count(genotype.allele_id)
> from allele, genotype
> where allele.allele_id = genotype.allele_id
> group by allele.variation_id");
> $sth->execute();
> $sth->finish;
The first thing to try when that happens is to run the SELECT portion by itself
and see if it returns any rows. If it doesn't, then the above INSERT...SELECT
would be a no-op.
The only thing that would cause no rows for the above query is if the two tables
"allele" and "genotype" have no rows matching each other.
Although you have a count(), the fact you also have a group-by means that the
query could return zero rows.
Another thing you should do when writing SQL is to put the table join conditions
in the FROM clause rather than the WHERE clause, like this:
INSERT into frequency (total_count)
SELECT count(genotype.allele_id)
from allele inner join genotype on allele.allele_id = genotype.allele_id
group by allele.variation_id;
Moreover, because you are joining on common column names, this shorter version
is better:
INSERT into frequency (total_count)
SELECT count(allele_id)
from allele inner join genotype using (allele_id)
group by allele.variation_id;
When you say "using", besides being shorter, the two matching columns are also
combined into one automatically, so you can just say "allele_id" elsewhere and
it won't be confused about "which table" since it doesn't matter. (The only
time it might matter is if you're doing an outer join and you want to explicitly
test that a row didn't match by testing that the other column copy is null.)
-- Darren Duncan
--
MySQL Perl Mailing List
For list archives: http://lists.mysql.com/perl
To unsubscribe: http://lists.mysql.com/[email protected]