![](/img/trans.png)
[英]How to use dynamic value of table column in the value of another column on INSERT
[英]How To: Insert into column where the value is on another table
我想寫一個預訂代碼。 我有一個小問題,我想在另一個名為house_info
表中的booked
表中插入一個值。
booked
& house_info
數據庫的詳細信息如下:
預定桌位
ID_Booking | House_Name | House_ID | House_No | House_Qty | House_Price |
1 | Rose House | 1 | RH01 | 1 | |
2 | Rose House | 1 | RH02 | 1 | |
房屋信息表
House_ID | HouseState_Name | House_Qty | House_Price |
1 | Garden City | 8 | 40000|
2 | Electronic City | 10 | 1000000|
我想在插入House_Price
上的值house_info
表到House_Price
柱上booked
表預訂表上的用戶每次輸入。
我已經在booked
桌子上使用觸發器嘗試過這個,如下所示:
在預訂表上觸發(插入前)
IF NEW.House_ID= '1' THEN SET
NEW.House_Price = 40000;
ELSEIF NEW.House_ID= '2' THEN SET
NEW.House_Price = 1000000;
但我意識到這不是動態的,因為當公司想要更改每個HouseState_Name
的價格時,他需要從觸發器中更改它。 所以我認為我需要的是來自PHP
的query
,它可以調用每個HouseState_Name
的值並將其保存在一個array
並在Book Query傳遞時將其放置或插入(我希望我的邏輯是正確的,如果它是,我很抱歉錯誤的)。
我已經嘗試過搜索要使用的query
。 但我不知道我將如何使用查詢。
預訂.php
require 'Connection.php';
//Check Connection
if ($conn->connect_error){
die("Connection Failed: ". $conn->connect_error);
}
//Check for Submit
if (filter_has_var(INPUT_POST, 'Submit')) {
//Get Form Data
$CustomerEmail= htmlspecialchars($_POST["Email"], ENT_QUOTES);
$House_Name= htmlspecialchars($_POST["HouseName"], ENT_QUOTES);
$House_ID = htmlspecialchars($_POST["HouseID "], ENT_QUOTES);
$House_No = htmlspecialchars($_POST["HouseNo "], ENT_QUOTES);
//Validate the data fields
if (!empty($CustomerEmail) && !empty($House_Name)) {
//Passed
if (filter_var($CustomerEmail, FILTER_VALIDATE_EMAIL) === false) {
//Failed
$msg = 'Please use a valid email';
header("location: ../GardenCity.php?error=PleaseUseValidEmail");
} else {
//Passed
echo "Creating a Booking.<br>";
//Inserting the Booking Data into Database
$sql = "INSERT INTO `booked`(`ID_Booking`, `CustomerEmail`, `House_Name`, `House_ID`, `House_No`)
VALUES (NULL, '$CustomerEmail', '$House_Name', '$House_ID ', '$House_No', '', '')";
if ($conn->query($sql) === TRUE) {
header("location: ../GardenCity.php");
} else {
echo "Error: " . $sql . "<br><br>" . $conn->error;
}
}
} else {
header("location: ../GardenCity.php?error=EmptyFields");
}
}
$conn -> close();
更新價格前
數據庫外觀
ID_Booking | House_Name | House_ID | House_No | House_Qty | House_Price | 1 | Rose House | 1 | RH01 | 1 | | 2 | Rose House | 1 | RH02 | 1 | | 3 | Rose House | 1 | RH03 | 1 | 40000|
House_ID | HouseState_Name | House_Qty | House_Price | 1 | Garden City | 7 | 40000| 2 | Electronic City | 10 | 1000000|
更新價格后
數據庫外觀
ID_Booking | House_Name | House_ID | House_No | House_Qty | House_Price | 1 | Rose House | 1 | RH01 | 1 | | 2 | Rose House | 1 | RH02 | 1 | | 3 | Rose House | 1 | RH03 | 1 | 40000| 4 | Rose House | 1 | RH04 | 1 | 200000|
House_ID | HouseState_Name | House_Qty | House_Price | 1 | Garden City | 6 | 200000| 2 | Electronic City | 10 | 1000000|
我希望這能得到很好的解釋。 如果有任何令人困惑的陳述或問題,請告訴我。 如果這個問題得到解答,我會非常感謝你們,因為我被困在這個問題上,我的大腦無法工作。
我認為這可以工作,基本上只使用子查詢來獲取價格,應該獲得與插入觸發器相同的結果,但不使用固定價格。
INSERT INTO `booked` (
`ID_Booking`,
`CustomerEmail`,
`House_Name`,
`House_ID`,
`House_No`,
`House_Qty`,
`House_Price`
) VALUES (
NULL,
'$CustomerEmail',
'$House_Name',
'$House_ID',
'$House_No',
'1',
(SELECT House_Price FROM house_info WHERE House_ID = '$House_ID')
)
編輯:我將House_Qty
設置為 1,根據您的需要進行更改:)
也許您可以直接在觸發器中使用相同的子查詢(尚未測試):
SET NEW.House_Price =
(SELECT House_Price FROM house_info WHERE House_ID = NEW.House_id);
假設您的House_ID
是唯一的 :)
我希望或多或少會看到這樣的模式:
houses(house_id*,name)
house_prices(house_id*,price_start_date*,price)
bookings(booking_id*,customer_id,total)
booking_detail(booking_id*,house_id*,start_date,end_date)
* = (component of) PRIMARY KEY
經過一些思考,很明顯,您目前的擔憂會因這種設計而消失。
您可以使用INNER JOINs
構造這樣一個UPDATE
語句,其中一個在子查詢中作為booked
表的self-JOIN
,放在現有的INSERT
語句之后:
update house_info h join (
select b1.House_Price, b2.House_ID
from booked b1
join ( select House_ID,max(ID_Booking) as ID_Booking
from booked
group by House_ID
) b2
on b1.House_ID = b2.House_ID and b1.ID_Booking = b2.ID_Booking
) bb on bb.House_ID = h.House_ID
set h.House_Price = bb.House_Price;
但我應該承認你的表格設計不好,因為重復的列它們在每個中都包含相同的信息。
Insert Into booked_table (ID_Booking, House_Name, House_Id, House_No, House_Qty, House_Price)
Select 1, House_Name, House_ID, 'RHXX', House_Qty, (SELECT House_Price FROM house_info WHERE House_ID = MM1.House_ID) From booked_table MM1
Where
NOT EXISTS(
SELECT *
FROM booked_table MM2
WHERE MM2.ID_Booking > MM1.ID_Booking
);
小提琴: https : //www.db-fiddle.com/f/7Bt3ZTQqbjs1jKzJe34qSF/0
我不包括 ID_Booking 和 House_No 的增量。 如果您想增加 House_Price,只需使用另一個查詢即可。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.