[MySQL] サンプル
トップページへ
備忘録です。エラー処理は省略しています。
PHP(楽天市場で探す ・ amazonで探す)言語を使い、同じ処理を、作成が容易でメンテしやすい2つのSQLを使う方法(パターンA)、SQL文が複雑になるものの1回の実行で済む方法(パターンB)で行った場合のサンプル
パターンA
1 テーブルAの特定コード(335860)を持つデータを抽出。テーブルAの日付と人数をワークに退避
2 テーブルBの日付とテーブルAの日付が一致したレコードのみ、テーブルBの人数にテーブルAの人数を加算して更新
$wsql = sprintf("SELECT * FROM %s WHERE (jcd = 335860) ORDER BY k_day", テーブルA); $stmt2 = $dbh->prepare($wsql); $stmt2->execute(); $wsql = sprintf("UPDATE %s SET tnin = tnin + :c WHERE k_day =:key", テーブルB); $stmt = $dbh->prepare($wsql); while ($row = $stmt2->fetch()){ $wk_nin = $row['tnin']; $stmt->bindParam(':key', $row['k_day'], PDO::PARAM_STR); $stmt->bindParam(':c', $wk_nin, PDO::PARAM_INT); $stmt->execute(); } //while
パターンB
1 テーブルAの特定コード(335860)を条件とする
2 テーブルBの日付とテーブルAの日付が一致も条件とする
3 1と2の条件を満たすテーブルBのレコードを抽出し、そのレコードの人数にテーブルAの人数を加算して更新
$wsql = "UPDATE テーブルB,テーブルA SET テーブルB.tnin = テーブルB.tnin + テーブルA.tnin WHERE (テーブルB.k_day = テーブルA.k_day) and (テーブルA.jcd = 335860)"; $stmt = $dbh->prepare($wsql); $stmt->execute();
INSERT文のサンプル
SELECT文を使った場合のサンプル
1 テーブル2の特定のコード(335860)のレコードをテーブル1に追加する。
2 追加する時、コードを別のコード(600000)に書き換える
3 追加した時、キーが重複したら追加ではなく更新処理(tninを加算する)とする
INSERT INTO table1(`cd`, `k_day`, `zennin`, `tnin`) SELECT 600000, `k_day`, `zennin`, `tnin` FROM table2 WHERE cd = 335860 ON DUPLICATE KEY UPDATE table1.tnin = table1.tnin + table2.tnin