このエントリーをはてなブックマークに追加

更新日: 2016年2月25日

実行時間: 0.0227

Active Record (読込み処理) Part 3

 この項では、レコードのグループ化、並び替え(ソート)や、テーブル結合など、 より複雑なデータ参照の方法を解説していきます。

グループ化

 同じ列内で、同じ値を持つレコードをグループ化することにより、 そのグループレコードの特定の列の値の集計や平均値などを取得することが可能となります。

group_by($by)

 「GROUP BY」句を生成します。

 引数には、グループ化するフィールド名を指定します。

    $by = 'category';
    $this->db->group_by($by);
    GROUP BY `category`

 複数のフィールド名を指定する場合は、「,」区切りの文字列で指定するか、配列で指定します。 もしくは、複数回メソッドを実行します。

    • 文字列で指定
    $by = 'category, color';
    $this->db->group_by($by);
    • 配列で指定
    $by = array(
        'category
    ,     'color
    , );
    $this->db->group_by($by);
    • 複数回実行
    $this->db->group_by('category');
    $this->db->group_by('color');
    GROUP BY `category`, `color`

having($key, $value = '', $escape = TRUE)

 「HAVING」句を生成します。
 グループ化されたデータから、更に条件を指定する場合は、「HAVING」句を利用します。

 引数の指定の仕方は「where()」メソッドとほぼ同様です。
 「having()」メソッドでは、条件の「値」にNULLを指定することができません。 「IS NULL」の条件句を指定したい場合は、文字列で「'IS NULL'」と指定する必要があります。

    • 文字列で指定
    $this->db->having('sales >', 50);
    $this->db->having('status', 1);
    • 連想配列で指定
    $having = array(
        'sales > => 50,
        'status > => 1,
    );
    $this->db->having($having);
    HAVING `sales` > 50 AND `status` = 1

or_having($key, $value = '', $escape = TRUE)

 「having()」メソッドは、複数の条件を「AND」で連結していきますが、 「or_having()」メソッドは、複数の条件を「OR」で連結していきます。

 引数の指定方法は「having()」メソッドと同様です。

    • 文字列で指定
    $this->db->having('sales >', 50);
    $this->db->or_having('status', 1);
    • 連想配列で指定
    $having = array(
        'sales > => 50,
        'status > => 1,
    );
    $this->db->or_having($having);
    HAVING `sales` > 50 OR `status` = 1

並べ替え(ソート)と行数制限

 レコードを特定のフィールドの値をキーに並べ替え(ソート)して取得するには、「ORDER BY」句を利用します。

 レコード数を制限して取得するには、「LIMIT」句を利用します。

order_by($orderby, $direction = '') 一番上に戻る

 「ORDER BY」句を生成します。

 第一引数に並び替え(ソート)のキーとしたいフィールド名を指定します。

 第二引数には、「ASC」(昇順)、または、「DESC」(降順)、「RANDOM」のいずれかを指定することができます。
指定しなかった場合は、「ASC」が指定されたものとして処理されます。

 Oracle、及び、MSSQLドライバーを利用する場合は、「RANDOM」の指定は、「ASC」として処理されます。

    $this->db->order_by('age');
    ORDER BY `age` ASC
    $this->db->order_by('age', 'DESC');
    ORDER BY `age` DESC

 複数のフィールド名を指定する場合は、「,」区切りの文字列で指定するか、 複数回メソッドを実行します。

    • 文字列で指定
    $this->db->order_by('age DESC, amount ASC');
    • 複数回実行
    $this->db->order_by('age', 'DESC'); $this->db->order_by('amount', 'ASC');
    ORDER BY `age` DESC, `amount` ASC

limit($value, $offset = '') 一番上に戻る

 「LIMIT」句を生成します。

 第一引数に取得するレコード数の最大値を指定します。
検索結果が指定した値以上のレコード数の場合、指定したレコード数分のデータだけ返されます。

 第二引数には、オプションで「OFFSET」値を指定することができます。
検索結果の指定した値以降のデータから「LIMIT」のレコード数分返されます。

    $this->db->limit(50);
    LIMIT 50
    $this->db->limit(50, 100);
    LIMIT 50 OFFSET 100
    • MySQLでは
    LIMIT 100, 50

offset($offset) 一番上に戻る

 「OFFSET」句を生成します。
 必ず、「limit()」メソッドと共に利用します。

 「limit()」メソッドの第二引数に指定するのと同様の効果がありますが、 「limit()」メソッドで指定し、且つ、「offset()」メソッドを実行した場合は、 「offset()」メソッドで指定した「OFFSET」値が優先されます。

    $this->db->limit(50);
    $this->db->offset(100);
    • limit()メソッドで指定したOFFSET値は無視されます
    $this->db->limit(50, 200); $this->db->offset(100);
    LIMIT 50 OFFSET 100

get()、get_where()メソッドで「LIMIT」「OFFSET」の指定 一番上に戻る

 「get()」メソッド、「get_where()」メソッドでも「LIMIT」「OFFSET」を指定することができます。

 「get()」メソッドでは、第二引数に「LIMIT」値、第三引数に「OFFSET」値を指定します。

    $this->db->get('any_table', 50, 200);

 「get_where()」メソッドでは、第三引数に「LIMIT」値、第四引数に「OFFSET」値を指定します。

    $where = '`status` = 1'; $this->db->get_where('any_table', $where, 50, 200);

 「limit()」メソッド、「offset()」メソッドでの指定よりも、  「get()」メソッド、「get_where()」メソッドで指定した「LIMIT」値、「OFFSET」値が優先されます。

    $this->db->limit(50); // 無視されます
    $this->db->offset(100); // 無視されます
    $this->db->get('any_table', 20, 40);
    SELECT * FROM `any_table` LIMIT 20 OFFSET 40

テーブルの結合

 テーブルの結合を行うことによって、一度のSQL発行で複数のテーブルからデータを取得することができます。 テーブルを結合するには、「JOIN」句を利用します。

join($table, $cond, $type = '') 一番上に戻る

 「JOIN テーブル ON 結合条件」句を生成します。

 第一引数には、結合するテーブル名を指定します。

 第二引数には、結合条件を文字列で指定します。

 第三引数には、結合方法を「LEFT」「RIGHT」「INNER」「OUTER」のいずれかで指定します。
指定しなかった場合は「INNER」結合としてSQLが生成されます。

    $this->db->from('table_a');
    $cond = 'table_a.title = table_b.title';
    $this->db->join('table_b', $cond);
    FROM (`table_a`) JOIN `table_a`.`title` = `table_b`.`title`

 「join()」メソッドを複数回実行することで3つ以上のテーブルを結合することも可能です。

    $this->db->from('table_a');
    $cond = 'table_a.title = table_b.title';
    $this->db->join('table_b', $cond);
    $cond = 'table_a.title = table_c.title';
    $this->db->join('table_c', $cond);
    FROM (`table_a`) JOIN `table_a`.`title` = `table_b`.`title` JOIN `table_a`.`title` = `table_c`.`title`

関数

CodeIgniterのActiveRecordには、いくつかのSQL関数を利用する方法が用意されています。

select_max($select = '', $alias = '') 一番上に戻る

 「MAX()」関数を生成します。

 第一引数には、最大値を取得したいフィールド名を指定します。

 第二引数には、フィールド名のエイリアスとして指定したい文字列を指定します。

    $this->db->select_max('value');
    SELECT MAX(`value`)
    $this->db->select_max('value', 'max_value');
    SELECT MAX(`value`) AS max_value

select_min($select = '', $alias = '') 一番上に戻る

 「MIN()」関数を生成します。

 第一引数には、最小値を取得したいフィールド名を指定します。

 第二引数には、フィールド名のエイリアスとして指定したい文字列を指定します。

    $this->db->select_min('value');
    SELECT MIN(`value`)
    $this->db->select_min('value', 'min_value');
    SELECT MIN(`value`) AS min_value

select_avg($select = '', $alias = '') 一番上に戻る

 「AVG()」関数を生成します。

 第一引数には、平均値を取得したいフィールド名を指定します。

 第二引数には、フィールド名のエイリアスとして指定したい文字列を指定します。

    $this->db->select_avg('value');
    SELECT AVG(`value`)
    $this->db->select_avg('value', 'avg_value');
    SELECT AVG(`value`) AS avg_value

select_sum($select = '', $alias = '') 一番上に戻る

 「SUM()」関数を生成します。

 第一引数には、加算合計値を取得したいフィールド名を指定します。

 第二引数には、フィールド名のエイリアスとして指定したい文字列を指定します。

    $this->db->select_sum('value');
    SELECT SUM(`value`)
    $this->db->select_sum('value', 'sum_value');
    SELECT SUM(`value`) AS sum_value

重複の除外

重複レコードを削除したデータを取得する「SELECT DISTINCT」分の生成方法を解説します。

distinct($val = TRUE) 一番上に戻る

 「DISTINCT」句を生成します。

    $this->db->distinct();
    SELECT DISTINCT

 引数に「FALSE」を指定すると、一度指定した「DISTINCT」句生成指示を無効にすることができます。

    $this->db->distinct(); // DISTINCT 指定

    if (何かしらの条件) {
        $this->db->distinct(FALSE); // DISTINCT 無効
    }

その他

CodeIgniterのActiveRecordで提供されているその他の機能について紹介します。

count_all_results($table = '') 一番上に戻る

 引数に指定したテーブルから参照データのレコード数を返します。

 検索条件を「where()」メソッドや「like()」メソッドなどで検索条件を指定して、特定の条件での
検索結果レコード数を取得することができます。
 検索条件を指定しなかった場合は、対象のテーブルの全レコード数が返されます。

    $table = 'any_table';
    $count_all = $this->db->count_all_results($table);
    echo $table . "の全レコード数は、" . $count_all . "件です。";
    // any_tableの全レコード数は、38件です。
    $this->db->where('id >', 20);
    $table = 'any_table';
    $count_all = $this->db->count_all_results($table);
    echo $table . "の'id'が21以上のレコード数は、" . $count_all . "件です。";
    // any_tableの全レコード数は、18件です。

dbprefix($table = '') 一番上に戻る

 設定ファイルなどで指定した「dbprefix」接頭辞を付加したテーブル名を返します。

    //config/database.php
    $db['default']['dbprefix'] = "projectx_";
    $table_name = $this->db->dbprefix('any_table');
    echo $table_name;
    // projectx_any_table

set_dbprefix($prefix = '') 一番上に戻る

 データベース設定の「dbprefix」値を一時的に上書きします。
上書きされた設定は、そのインスタンスのみ有効となります。

    //config/database.php
    $db['default']['dbprefix'] = "projectx_";
    $table_name = $this->db->dbprefix('any_table');
    echo $table_name;
    // projectx_any_table

    $this->db->set_dbprefix('temp_'); // 上書き
    $table_name = $this->db->dbprefix('any_table');
    echo $table_name;
    // temp_any_table