

既に作成済みのストアドプロシージャであるranking_longは新たに作成したそれを呼び出すためだけのストアドプロシージャによって、その定義内にCALL
`ranking_long`()と記述することにより以下の様な実行結果を出します。

[code]

    product_id  plg_count   rank
    11          6962271     1
    10          2705517     2
    379         1955067     3
    378         196865      4
    ...........
    
[/code]

上記の様に出された結果を既に作成してある全く同じ構造を持つテーブルdtb_rankingにupsert(同じproduct_idがあればupdate、なければinsert)するストアドプロシージャを作成したいと考え、とりあえず以下の様な記述を試しておりますが、エラーが表示されます（「記述上複数の誤りがあります」といった内容）。

[code]

    INSERT INTO dtb_ranking (`product_id`,`plg_count`,`rank`) VALUES (CALL `ranking_long`())ON DUPLICATE KEY UPDATE plg_count = NEW.plg_count, rank = NEW.rank; 
    
[/code]

上記の目的を達成させるためにはどのような記述にしなければならないかご教示頂けませんでしょうか。

dtb_rankingの構造

[code]

    product_id  plg_count   rank
    
[/code]

ご教示からの記述：

[code]

    INSERT INTO dtb_ranking (`product_id`,`plg_count`,`rank`) VALUES (CALL `ranking_long`()) ON DUPLICATE KEY UPDATE plg_count = VALUES(plg_count), rank = VALUES(rank);
    
[/code]

  
その実行によって出されたメッセージ：

[code]

    One or more errors have occurred while processing your request:
    クエリの実行に失敗しました：『CREATE DEFINER=`xxxxxxx`@`%` PROCEDURE `call_ranking_long`() NOT DETERMINISTIC NO SQL SQL SECURITY DEFINER INSERT INTO dtb_ranking (`product_id`,`plg_count`,`rank`) VALUES (CALL `ranking_long`()) ON DUPLICATE KEY UPDATE plg_count = VALUES(plg_count), rank = VALUES(rank);』
    MySQL のメッセージ: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CALL `ranking_long`()) ON DUPLICATE KEY UPDATE plg_count = VALUES(plg_count), ra' at line 1
    
[/code]


CC BY-SA 4.0
2018-03-30T21:03:11.250
42806
2020-10-08T07:04:55.573
2020-08-25T11:42:38.100
3060
19211
question
php mysql sql smarty
MySQLで作成済みストアドプロシージャの実行結果を既存のテーブルにupsertするには


適切にインデックスが張られていると想定して、前半はわかりませんが、ON DUPLICATE KEY以降を以下のようにすると良いと思います。

[code]

    ON DUPLICATE KEY UPDATE plg_count = VALUES(plg_count), rank = VALUES(rank);
    
[/code]

<https://dev.mysql.com/doc/refman/5.6/ja/insert-on-duplicate.html> には、  
UPDATE 句で VALUES(col_name) 関数を使用して、INSERT ... ON DUPLICATE KEY UPDATE ステートメントの
INSERT 部分からカラム値を参照できます。

とありますので、これでinsertで入れようとした値を入れてくれると思います。


CC BY-SA 3.0
2018-03-30T23:07:19.643
42808
2018-03-30T23:07:19.643
27937
42806
answer