ビューのメモ(SQLite)
やり方忘れそうなのでメモ。
このスクリプトで使用するテーブルは以下の4つです。
グループ=大カテゴリ、エントリ=中カテゴリ、エントリタイプ=小カテゴリ。
            不要なカラムは省略しています。
pict_group
| gid | gp_dir | gp_sortkey | gp_name | 
|---|---|---|---|
| 1 | button | 2 | ボタン | 
| 2 | background | 1 | 背景画像 | 
| 3 | icon | 3 | アイコン | 
pict_entry
| eid | gid | entry_dir | entry_name | entry_entrydate | 
|---|---|---|---|---|
| 1 | 1 | 004 | ドット#01 | 2000-09-13 00:00:00 | 
| 2 | 1 | 008 | バーコード#01 | 2000-09-13 00:00:00 | 
| 3 | 2 | 008 | 花#01 | 2000-10-20 00:00:00 | 
| 4 | 3 | 001 | 矢印 | 2000-09-13 00:00:00 | 
pict_entry_type
| tid | eid | type_dir | type_name | type_width | type_height | 
|---|---|---|---|---|---|
| 1 | 1 | a | あお | 61 | 31 | 
| 2 | 1 | b | あお | 61 | 31 | 
| 3 | 2 | a | みどり | 55 | 55 | 
| 4 | 2 | b | あお | 55 | 55 | 
pict_log
| log_no | tid | log_date | 
|---|---|---|
| 1 | 2 | 2007-03-12 01:00:59 | 
エントリ毎のDL数&最終DL日を使用する為のビュー
CREATE VIEW pict_log_count_view AS
      SELECT pict_entry_type.eid as eid, MAX(pict_log.log_date) as recent_date, COUNT(pict_log.log_no) as dl_num
        FROM pict_entry_type
  INNER JOIN pict_log ON pict_entry_type.tid = pict_log.tid
    GROUP BY pict_entry_type.eid;
このビューは、エントリIDごとの最新ダウンロード日、ダウンロード数をあらかじめ持つテーブルとなります。
クエリ例
以下のようなクエリで使用しています。
全てのグループの一覧を取得。
$query = $this->db->query('
    SELECT pict_group.gid as gid,
           pict_group.gp_name as gp_name,
           COUNT(pict_entry.eid) as entry_num,
           MAX(pict_log.recent_date) as recent_date,
           SUM(pict_log.dl_num) as dl_num
      FROM pict_group
 LEFT JOIN pict_entry ON (pict_group.gid = pict_entry.gid)
 LEFT JOIN pict_log_count_view as pict_log ON pict_entry.eid = pict_log.eid
  GROUP BY pict_group.gid
  ORDER BY gp_sortkey asc
');
最終的に取得したフィールドは以下のとおり。
- グループID
- グループ名
- グループに属するエントリの数
- グループ全体の最新ダウンロード日
- グループ全体のダウンロード数
特定グループに登録されているエントリの一覧を取得。
$query = $this->db->query('
    SELECT pict_entry.eid as eid,
           pict_entry.gid as gid,
           pict_entry.entry_status as entry_status,
           pict_entry.entry_dir as entry_dir,
           pict_entry.entry_name as entry_name,
           pict_entry.entry_entrydate as entry_entrydate,
           ifnull(pict_log.dl_num, 0) as dl_num
      FROM pict_entry
 LEFT JOIN pict_log_count_view as pict_log ON pict_entry.eid = pict_log.eid
     WHERE pict_entry.gid = '.intval($this->af->get('gid')).'
  GROUP BY pict_entry.eid
  ORDER BY entry_name asc
');
最終的に取得したフィールドは以下のとおり。
- エントリID
- グループID
- エントリのステータス
- エントリのディレクトリ
- エントリ名
- エントリの登録日
- エントリのダウンロード数(ない場合は0に置き換える)
あまり使ってないけど。
