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)

トラックバック(1)

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

cloudpack logo

About Me

フリーランスで、テクニカルディレクターたまにプログラマーをやっている後藤和貴(ごとうかずたか)です。

最近はAWSなどクラウドコンピューティングに興味あり。導入支援サービスAWS+はじめました

自己紹介的なものはまだ書いてないので、ひとまずこちら

連絡先は kaz.goto[at]gmail.com。

最近のブログ記事

閉じる