質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.81%

ちょっと複雑なinsert文をcodeigniterで実行したい

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 624

awazon78

score 27

INSERT INTO TABLE_A
SELECT *
FROM TABLE_B
where date > 0
order by id DESC
limit 10;

テーブルBからテーブルAへコピーするSQL文です。
上記のSQL文をcodeigniterで実行したいのですがエラーが出てしまって実行出来ません。

     $this->db->select('*');
        $this->db->insert('TABLE_A',$date);
        $this->db->from('TABLE_B');
        $this->db->where($where);
        $this->db->order_by('id', 'DESC');
        $this->db->limit(10);


エラー内容

レコードを更新するには、"set" メソッドを使う必要があります。


どのように記述したらcodeigniterで実行できるでしょうか・

-------------------------以下 10/28 15:28追記
趣旨から違う為書きませんでしたが、本来やりたい事は以下になります。
TABLE_AからTABLE_Bへインサート
インサートした物はDELETEです。

   $time_start = microtime(true);
        $where = [
                 'date >' => 0,
        ];
        $this->db->order_by('id', 'DESC');
        $this->db->limit(100000);
        $records = $this->db->get('TABLE_A')->result_array();


        foreach ($records as $key =>$record) {
            $this->db->insert('TABLE_B', $record);    
            $this->db->delete('TABLE_A', ['id' => $record['id']]);
        }

しかしこれだとなかなか遅い。。。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • m.ts10806

    2019/10/28 15:40

    >単にSQLが実行できれば
    大抵のフレームワークではクエリビルダによる組み立てだけでなく、開発者が文字列として渡したSQLをそのまま実行できる機能があります。つまり提示のSQLをそのまま渡して実行結果を得られる機能を利用するという意味です。

    キャンセル

  • awazon78

    2019/10/28 15:42

    $this->db->query($sql)ですね?

    キャンセル

  • m.ts10806

    2019/10/28 15:45

    ドキュメントにある通りかと
    回答も出てますが。
    結局はどのシーンで使うかです。そこにしかないのならそれでも良いでしょうが、他にも類似機能があったりケースにより内容が変わったり共有があるのでしたらクエリビルダでできる範囲で対応するのが良いでしょう…
    が、このフレームワークは軽さ速さを重視しているものになるので、別の回答にあるように一気にやろうとせず段階追ってひとつずつ処理をしていくのが得策かもしれません。
    要件次第ですね

    キャンセル

回答 3

0

codeigniterはよくわからないのですがquery的なメソッドがありませんか?
もしくは一度selectして結果をっておいてinsert_stringなど流し込むとか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

$this->db->query($sql)

かな?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

CodeIgniterのクエリビルダに実装されているinsert()メソッドは
INSERT INTO <table_name> (<columns>) ~ VALUES (<values>); の形式しか対応していません。

ソースコード
https://github.com/bcit-ci/CodeIgniter/blob/3.1.11/system/database/DB_query_builder.php#L1639-L1671
https://github.com/bcit-ci/CodeIgniter/blob/3.1.11/system/database/DB_driver.php#L1459-L1472

SELECT部分だけクエリビルダで作ることなら可能です。

$where = array('date >' => 0);
$this->db->select('*');
$this->db->from('TABLE_B');
$this->db->where($where);
$this->db->order_by('id', 'DESC');
$this->db->limit(10);
$select_sql = $this->db->get_compiled_select();

$insert_sql = "INSERT INTO `TABLE_A`\n{$select_sql}";
$this->db->query($insert_sql);

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.81%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る