カテゴリー
technology

DBIC で count したもので order by する方法

Hatena::Diary::Neko::kak 500 Internal Server Error – countしたものにorder by
http://en.yummy.stripper.jp/?eid=448071
DBICではたぶん発行するSQLのカラムに別名をつけられないみたいなので
スカラーリファレンスでしかたないんじゃないすかね。

同じことで悩んだ時期もありましたが、いろいろ試してみた結果 order by 句に count(hoge) そのものを指定できることがわかりました。(少なくとも MySQL と SQLite で動作確認済み)

$rs = $schema->search(
{},
{ select   => [ 'link', { count => 'entry' } ],
group_by => [qw/ link /],
order_by => 'count(link) DESC',
page     => $page,
rows     => $rows_per_page }
);

そんなの知るわけないじゃんと思ってたらやはり SQL92 の仕様的には order by 句には sort_key が、そして sort_key は column_name か unsigned_integer となるので order by count(hoge) は問題みたいですが、SQL99 以降ではなんやかんやで order by count(hoge) でも問題ないのですね。へぇー。


以下、SQL99 での sort_key 定義から count(hoge) まで。

<sort key> ::= <value expression>
<value expression> ::=
<numeric value expression>
|     <string value expression>
|     <datetime value expression>
|     <interval value expression>
|     <boolean value expression>
|     <user-defined type value expression>
|     <row value expression>
|     <reference value expression>
|     <collection value expression>
<collection value expression> ::= <value expression primary>
<value expression primary> ::=
<parenthesized value expression>
|     <nonparenthesized value expression primary>
<nonparenthesized value expression primary> ::=
<unsigned value specification>
|     <column reference>
|     <set function specification>
|     <scalar subquery>
|     <case expression>
|     <cast specification>
|     <subtype treatment>
|     <attribute or method reference>
|     <reference resolution>
|     <collection value constructor>
|     <routine invocation>
|     <field reference>
|     <element reference>
|     <method invocation>
|     <static method invocation>
|     <new specification>
<set function specification> ::=
COUNT <left paren> <asterisk> <right paren>
|     <general set function>
|     <grouping operation>
<general set function> ::=
<set function type> <left paren> [ <set quantifier> ] <value expression> <right paren>
<set function type> ::= <computational operation>
<computational operation> ::= AVG | MAX | MIN | SUM | EVERY | ANY | SOME | COUNT

BNF Grammar for ISO/IEC 9075:1992 – Database Language SQL (SQL-92)
BNF Grammar for ISO/IEC 9075:1999 – Database Language SQL (SQL-99)

「DBIC で count したもので order by する方法」への1件の返信

DBIC で件数順に並び変える(count したものにorder by)

count を取ってそれを表示するのは次のコードで問題ないです。まあ、想像どおりですね。my @ranking_posts = $c->model(…

コメントは受け付けていません。