SQLToolsプラグインプチバージョンアップ

先日公開したSQLToolsプラグインを、若干バージョンアップしました。
MySQLの「SQL_CALC_FOUND_ROWS」の機能に対応しました。

1.SQL_CALC_FOUND_ROWSの概要

SQLでデータを読み込む際に、条件を満たすデータの全件数と、その条件に合う一部のデータを、合わせて得たい場合があります。

例えば、ブログの記事を10件ずつページ分割するとします。
この場合、分割後のページ数を計算するために、記事の全件数が必要です。
一方、個々のページでは、10件ずつの記事だけを読み込みます。

MySQLでは、このような処理をする際に便利な機能として、「SQL_CALC_FOUND_ROWS」があります。
SQLのSELECT文で、SELECTの直後に「SQL_CALC_FOUND_ROWS」を入れておくと、LIMITで件数を指定して読み込む場合でも、条件に合うすべてのデータの件数を得ることができます。

2.プラグインのバージョンアップ

バージョンアップしたプラグインは、以下からダウンロードします。

SQLTools_1_01.zip

ダウンロードしたZipファイルを解凍すると、「plugins」のフォルダができます。
このフォルダを、Movable Typeのインストール先ディレクトリにアップロードします。

3.SQLの変更

SQL_CALC_FOUND_ROWSの機能を使いたい場合、SQL文側では、SELECTの直後に「SQL_CALC_FOUND_ROWS」を入れておきます。
例えば、IDが1番のブログから最新の10件だけ記事を読み込み、なおかつ記事の総数も得たいときは、SQLを以下のように組みます。

SELECT SQL_CALC_FOUND_ROWS entry_id
FROM mt_entry
WHERE entry_class = ?
AND entry_status = 2
AND entry_blog_id = 1
ORDER BY entry_authored_on DESC
LIMIT 10

4.テンプレートの変更

一方、MTSQLObjectsタグやMTSQLRowsタグでSQLを実行する際に、これらのテンプレートタグに「calc_rows="1"」というモディファイアを付加します。
すると、これらのタグのブロックの中で、「MTSQLTotalCount」というテンプレートタグを使って、条件に合うデータの件数を出力することができます。

5.注意事項

データの件数が多くなるにつれて、SQL_CALC_FOUND_ROWSは動作が重くなっていきます。
速度を重視する場合は、SQL_CALC_FOUND_ROWSを使わずに件数を数えるためのSQLを別途用意し、またテーブルに適切にインデックスを設定するなどの対策が必要です。

また、SQL_CALC_FOUND_ROWSはMySQL独自の機能です。
MySQL以外のデータベースでMovable Typeを運用するときには、この機能は使うことができません。