[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





関連記事
[MySQL] 個人的 逆引きリファレンス

[phpMyAdmin] テーブルを (データベース).(テーブル) にコピーするで失敗する

[MySQL]エラー集

[phpMyAdmin]現在の選択には一意の列が含まれていません。グリッド編集、チェックボックス、編集、コピー、および削除機能は使用できません

[MySQL]備忘録