总结问题:
我想写一个预订代码。我遇到了一个小问题,我想在另一个名为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|
我想在每次用户在预订表单上输入时booked
将house_info
表上的House_Price
值插入到表House_Price
列中。
您已经尝试过的背景:
我已经在表上使用触发器尝试过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
上,并在书籍查询通过时放置或插入它(我希望我的逻辑是正确的,如果它是假的,我很抱歉)。
我已经尝试搜索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
经过一番思考,很明显,您目前的担忧随着这种设计而消失了。
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,只需使用另一个查询即可。
您可以使用子查询中的INNER JOINs
其中一个作为booked
表的self-JOIN
构造这样的UPDATE
语句,放在现有的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;
但我应该承认你的表的设计不好,因为重复的列,它们在每个列中都包含相同的信息。
演示