前提
タグテーブルに「リンゴ」と「りんご」など同じ意味だけど異なる文字列があるので、
1つをオリジナルタグ( ID = origin_tag_id )とし、
それ以外を普通タグ( ID != origin_tag_id )としています。
実現したいこと
PHPで $origin_tag_ids = [1];
を指定レコードとし、次の UPDATE文 を知りたいです。
➀「指定レコード」のうち、「ID = origin_tag_id のレコード」の、sum_value に
➁「指定レコード」の、"target_value の合計値" をセットして
➂「指定レコード」のうち、「ID != origin_tag_id のレコード」の、sum_value に
④ "0" をセットする
具体的には以下タグテーブルに対し、次の流れのUPDATEを目指しています。
➀「ID=1, ID=3 のレコード」のうち、「ID=1 のレコード」の sam_value に
➁「ID=1, ID=3 のレコード」の、 "4+6=10" をセットして
➂「ID=1, ID=3 のレコード」のうち、「ID=3 のレコード」の、sum_value に
④ "0" をセットする
発生している問題・エラーメッセージ
複雑すぎてどのように書くのが良いのか分かりません…
該当のソースコード
更新対象のタグテーブルです。
SQL
1CREATE TABLE wp_tags ( 2 ID BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT, 3 tag_name VARCHAR(10) NOT NULL, 4 origin_tag_id BIGINT(20) UNSIGNED NOT NULL DEFAULT 0, 5 target_value INT(10) UNSIGNED NOT NULL DEFAULT 0, 6 sum_value INT(10) UNSIGNED NOT NULL DEFAULT 0, 7 PRIMARY KEY (ID), 8 INDEX idx_1 (origin_tag_id) 9); 10 11INSERT INTO wp_tags 12(tag_name, origin_tag_id, target_value, sum_value) 13VALUES 14('リンゴ', 1, 4, 999), # オリジナルタグ( ID = origin_tag_id ) 15('バナナ', 2, 1, 999), # オリジナルタグ( ID = origin_tag_id ) 16('りんご', 1, 6, 999); # 普通タグ( ID != origin_tag_id )
試したこと
考えてみたのは次のように2回のクエリを実行することですが、これで良いのでしょうか?
まず1回目のクエリで次のSELECTを実行し、
PHP
1$sql = " 2SELECT origin_tag_id 3 ,GROUP_CONCAT(ID) AS tag_id 4 ,SUM(target_value) AS sum_value 5FROM wp_tags 6WHERE origin_tag_id IN ( 1 ) 7GROUP BY origin_tag_id;";
この結果、次の $rows を得て、
PHP
1$rows = [ 2 ['origin_tag_id'=>1, 'tag_id'=>'1,3', 'sum_value'=>10] 3];
2回目のクエリで次のUPDATEという流れです。
PHP
1$case = "CASE ID "; 2foreach( $rows as $row ) { 3 $case .= "WHEN {$row['origin_tag_id']} THEN {$row['sum_value']} "; 4} 5$case .= "ELSE 0 END"; 6 7$sql = " 8 UPDATE wp_tags 9 SET sum_value = {$case} 10 WHERE ID IN ( {$origin_tag_ids} );";
ツールのバージョン
MySQL 5.7 です。
どのように書くのが良いのか知りたいです。
アドバイスよろしくお願い致します。
目的の結果
// UPDATE前 ('リンゴ', 1, 4, 999) ('バナナ', 2, 1, 999) ('りんご', 1, 6, 999) // UPDATE後 ('リンゴ', 1, 4, 10) ('バナナ', 2, 1, 999) ('りんご', 1, 6, 0)
回答2件
あなたの回答
tips
プレビュー