« infoseekでA3スポーツバック | メイン | BMW1シリーズ試乗してきました »
カテゴリー別エントリ一覧の出力順指定
2004年10月02日
最近、たまに自分のサイト内をおさらいしたいことも出てきました。
そんな時、エントリー一覧は、カテゴリ別に表示されたほうがよいのです。

少し前に作ったTomcat版のエントリー一覧ですが(サイドバーにリンクをつけました...まだ試験運用版なので、正式ではないのです)、カテゴリの表示順に特に決まりがなかったので気になっていました。
今さっき、やっと、やっと....修正しました。

この並び順のソートの仕方って、最近のコメントのorder順のときにそっくりです。
ひとつだけ、さらに厄介になっているのは、

mt_entry(エントリーの中身の入っているテーブル)

mt_category(カテゴリの内容が入っているテーブル)
のほかに、

エントリーとカテゴリをつなげるための
mt_placemnetというテーブルが存在することです。

mt_entryとmt_categoryは直接結合できないんです。

どうも、entry_category_idにはNULLが登録されているようです。
ひとつのエントリーに複数のカテゴリを指定するために、mt_placementが追加されたのでしょうか?
そしてentry_category_idは不要になってしまったのでしょうか?
(なぜ、使われなくなった列を残してあるのかな?)

っというのは、置いておいて....

エントリーとカテゴリを結合させるためには、
entry_id と mt_placementのplacement_entry_id → category_id と mt_placementのplacement_category_id
を結合する必要があります。

それでもって、ひとつのカテゴリに属するエントリーのうち、登録日付が新しいものが含まれるカテゴリを優先して表示しなければならないんです。

っというワケで、↓のようなクエリに落ち着きました。(カテゴリをエントリ登録日時の降順で求めるクエリ)
select   category_label
        ,category_id
from    mt_category
        ,mt_entry       
        ,mt_placement   main_placement
where   1 = 1
    and entry_id    =   placement_entry_id
    and placement_category_id = category_id
    and entry_created_on =
        (   
            select  max(entry_created_on)
            from    mt_entry
                    ,mt_placement sub_placement
            where   1 = 1
            and     entry_id  = sub_placement.placement_entry_id
            and     sub_placement.placement_category_id 
                        = main_placement.placement_category_id
        )
order by entry_created_on desc
※「entry_created_onがもしまったく同じ値のエントリーが複数存在したら...」と懸念したけれども、ありえないのでよしとします。

上記クエリを入れ込んで検索したのが、現在のTomcat版エントリー一覧です。
リンク先がJSPでエントリー内容を表示しているものになっていますが、blog内の静的なアーカイブへリンクしようかなとも思ってしまいます。

jsp全体のソースはこちらにあります。(加工なしのそのまんまです。)

カテゴリを選択したら、そのカテゴリに属するエントリーの中身じゃなくて、まずはエントリーの一覧が出るようにもしたいな。

投稿者 megu : 2004年10月02日 01:55

コメント

コメントしてください




保存しますか?