[Shibuya-pm] DBIx::Classについて質問させてください

田中 健一郎 ken-tanaka at genaris.co.jp
Wed Jun 25 21:34:39 PDT 2008


Shibuya-pm メンバーのみなさま

こんにちわ、初めて質問させていただきます。
田中健一郎と申します。
DBIx::Classを使用し、データベース内(postgreSQL)のデータを操作する処理に
ついて質問させてください。
現在、複数のテーブルをjoinを使用しつなげていって、あるカラムのデータを抽
出し、その総件数を得るというSQLをDBIx::Classを使用し、処理したいと考えております。

例としまして、5人以上の大学院生が参加しているプロジェクトを指揮している
教授を求めるとき、
プログラムの中で、SQLの部分だけ書くと、

my @col=map("me.".$_,$sch->class('Professors')->columns);
my $hrC={
select=>'me.prof_ssn',
join=>{'work_ins'=>{'pid'=>{'work_projs'=>'grad_ssn'}}},
having=>{'count(work_projs.grad_ssn)'=>{'>=',5}},
group_by=>['me.prof_ssn'],
};
my $rsP = $sch->resultset('Professors')->search($hrQ,$hrC);
#print $rsP->count,"\n";

となり、結果は、
486512566
248965255
090873519
141582651
というようになり、該当する教授のIDが表示されます。
ちなみに、SQL文に書くと、
SELECT me.prof_ssn FROM professors me LEFT JOIN work_in work_ins ON (
work_ins.prof_ssn = me.prof_ssn ) JOIN project pid ON ( pid.pid =
work_ins.pid ) LEFT JOIN work_proj work_projs ON ( work_projs.pid =
pid.pid ) LEFT JOIN graduates grad_ssn ON ( grad_ssn.grad_ssn =
work_projs.grad_ssn ) GROUP BY me.prof_ssn HAVING (
count(work_projs.grad_ssn) >= 5 );
なり、表示させると、
prof_ssn
------------
486512566
248965255
090873519
141582651
(4 rows)
なります。ちなみに、work_inテーブルはprofessorsテーブルとprojectテーブル
の間のrelationテーブルです。 work_projテーブルはprojectテーブルと
graduatesテーブルの間のrelationテーブルです。

しかし、該当する教授の総数(今で言うと4件)を求めようと、"count"を使用
したら、エラーが出たり、わけのわからない数字が表示されたりします。たとえ
ば、この場合ですと、13という数字が出ます。
いろいろ検証してみたのですが、どうもhavingを使用しているのが原因だとわ
かったのですが、
havingはどうしても使用したいと考えております。どうしても総数も求めたいの
ですが、どうしていいのか分からず、途方に暮れています。これはバグなので
しょうか?postgreSQLまたはPerlの仕様なのでしょうか?
もし、これを回避する何かいい案がありましたら教えていただけないでしょうか?
またご表示された時の数字は一体何を表わしているのか、ご存知でしたら教えて
いただけないでしょうか?
長くなりまして申し訳ございませんが、よろしくお願いいたします。



More information about the Shibuya-pm mailing list