そんな時、エントリー一覧は、カテゴリ別に表示されたほうがよいのです。
少し前に作った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
