2006.11.21 Tuesday
count を取ってそれを表示するのは次のコードで問題ないです。まあ、想像どおりですね。
これをposts_countで並び変えたいという要望はよくある話です。というか、並び変えないと意味ないことの方が多い。
ところが、これがなかなか難しい。想像すると、こんなコードでいけると思うかもしれない。
これがダメなんですよ。posts_count なんてカラムはないよ、と怒られてしまう。
このas ってところに書かれたposts_count はget_column が呼ばれるときに初めて生きてくるらしく、実際にこれで書かれるSQLはこんな感じになってしまっているからだ。
というわけで、ここでもスカラーリファレンスの登場です。(いいのか?)
もっといい方法があれば誰か教えてください。
2007年1月10日追記
こんな素晴らしい方法がありました。
[参考]DBIC で count したもので order by する方法(Klog)
つまり下記のようにすればいいってこと。
my @ranking_posts = $c->model('DBIC::TranMatchTrackBack')->search(
$query_ref,
{ select => [ 'user_id', { count => 'user_id' } ],
as => [qw/ user_id posts_count /],
group_by => ['user_id'],
},
);
foreach(@ranking_posts){
$_->{posts_count} = $_->get_column('posts_count');
}これをposts_countで並び変えたいという要望はよくある話です。というか、並び変えないと意味ないことの方が多い。
ところが、これがなかなか難しい。想像すると、こんなコードでいけると思うかもしれない。
my @data = $c->model('DBIC::TableName')->search(
$query_ref,
{ select => [ 'user_id', { count => 'user_id' } ],
as => [qw/ user_id posts_count /],
group_by => ['user_id'],
order_by => 'posts_count DESC',
},
);これがダメなんですよ。posts_count なんてカラムはないよ、と怒られてしまう。
このas ってところに書かれたposts_count はget_column が呼ばれるときに初めて生きてくるらしく、実際にこれで書かれるSQLはこんな感じになってしまっているからだ。
SELECTas ないじゃん。そりゃSQLエラーになりますよ。
user_id,
COUNT( user_id )
FROM
table_name
GROUP BY
user_id
ORDER BY
posts_count DESC
というわけで、ここでもスカラーリファレンスの登場です。(いいのか?)
my @data = $c->model('DBIC::TableName')->search(
$query_ref,
{ select => [ 'user_id', ¥'count( user_id ) as posts_count' ],
as => [qw/ user_id posts_count /],
group_by => ['user_id'],
order_by => 'posts_count DESC',
},
);これで万事うまくいくのですが、なんでもスカラーリファレンスってのはやっぱりちょっと抵抗あるなぁ。もっといい方法があれば誰か教えてください。
2007年1月10日追記
こんな素晴らしい方法がありました。
[参考]DBIC で count したもので order by する方法(Klog)
つまり下記のようにすればいいってこと。
my @data = $c->model('DBIC::TableName')->search(
$query_ref,
{ select => [ 'user_id', { count => 'user_id' } ],
group_by => ['user_id'],
order_by => 'count(user_id) DESC',
},
);すげぇ...