4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

【MySQL】【PHP】複数のテーブル(3つ以上)を一回のUPDATE文で更新するやり方

Last updated at Posted at 2015-05-21

MySQLのUPDATE文の3つのテーブル更新にて1時間以上手間取った。
問題はWHERE句の内容にあった。

	$sql =
		'UPDATE dat_sales_product

			INNER JOIN
				mst_product 

				ON dat_sales_product.code_product=mst_product.code
				
			INNER JOIN
				dat_sales

				ON dat_sales_product.code_sales=dat_sales.code
					
		SET
			dat_sales.name = ?,
			dat_sales.date = ?,
			dat_sales_product.quantity = ?,
			mst_product.name = ?,
			mst_product.gazou = ?

		WHERE
			dat_sales_product.code_product = ?

		$stmt = $dbh->prepare($sql);
		$data[] = $form['name'];

		$data[] = date('Y-m-d H:i:s');
		$data[] = $form['quantity'];
		$data[] = $form['mst_name'];

		$data[] = $_SESSION[filename];
		$data[] = $form['code_product'];
	
		$stmt->execute($data);
		$dbh = null';

このコードを試してテーブルが更新されない。
3つ以上のテーブルを更新するUPDATE文を書くときには
UPDATEのどこのテーブルのどのカラムかを4つ指定しなければいけなかった。

A,B,Cのテーブルで共通のIDを持っているBのテーブルを軸とするなら、
WHERE句で
A.id = "10"
B.id = "10"
B.id2 = "11"
C.id = "11"
といったように

AのテーブルとBのテーブルの共通項
BのテーブルとCのテーブルの共通項

4つの共通する項目の値を明示しないといけない。
ぐぐっても意外とのっていなかった。
以下のようにすると更新された。

	$sql =
		'UPDATE dat_sales_product

			INNER JOIN
				mst_product 

				ON dat_sales_product.code_product=mst_product.code
				
			INNER JOIN
				dat_sales

				ON dat_sales_product.code_sales=dat_sales.code
					
		SET
			dat_sales.name = ?,
			dat_sales.date = ?,
			dat_sales_product.quantity = ?,
			mst_product.name = ?,
			mst_product.gazou = ?

		WHERE
			dat_sales_product.code_product = ?
			AND mst_product.code = ?
			AND dat_sales_product.code_sales = ?
			AND dat_sales.code = ?';

		$stmt = $dbh->prepare($sql);
		$data[] = $form['name'];

		$data[] = date('Y-m-d H:i:s');
		$data[] = $form['quantity'];
		$data[] = $form['mst_name'];

		$data[] = $_SESSION[filename];
		$data[] = $form['code_product'];
		$data[] = $form['code_product'];
		$data[] = $form['code_sales'];
		$data[] = $form['code_sales'];
		
		$stmt->execute($data);
		$dbh = null';

同じように2つのテーブルの時は

inner joinの部分を1回だけ
WHERE句の共通カラムの項目を2つ
$data[]の内容を調節

4つのテーブルの時は

inner joinの部分を3回
WHERE句の共通項目を6つのテーブルのカラム
(A,B,C,DのテーブルではA.id=B.id,A.id=C.id,A.id=D.id,B.id=C.id,B.id=D.id,C.id=D.idといったように)
$data[]の内容を調節

で大丈夫でした。

ホント毎回忘れてしまうため、UPDATE文を書くときにはこれから注意して書くようにします。
ごめんなさい。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?